Access-Control-Allow-Origin 不允许来源

Posted

技术标签:

【中文标题】Access-Control-Allow-Origin 不允许来源【英文标题】:Origin is not allowed by Access-Control-Allow-Origin 【发布时间】:2012-04-25 22:49:42 【问题描述】:

我正在一个Sencha Touch 2 应用程序(包裹在PhoneGap)中为远程php 服务器创建一个Ajax.request

服务器的响应如下:

XMLHttpRequest 无法加载 http://nqatalog.negroesquisso.pt/login.php。 http://localhost:8888

我该如何解决这个问题?

【问题讨论】:

在使用 jQuery 时,设置 dataType: 'jsonp', 就可以了 顺便说一下不是来自服务器的响应。准确地说,错误是在客户端发出的。 jsonp 技巧可能不再起作用了,仅供参考:***.com/questions/12216208/… 注意,因为我只是浪费了半天的时间来追踪这个错误 - 如果服务器端脚本因内部服务器错误而失败,浏览器可能会将其解释为由于 @987654329 而不允许请求@ 并将其报告为错误。 There's an extension for that! 【参考方案1】:

不久前我写了一篇关于这个问题的文章,Cross Domain AJAX。

如果您可以控制响应服务器,则处理此问题的最简单方法是为以下内容添加响应标头:

Access-Control-Allow-Origin: *

这将允许跨域Ajax。在 PHP 中,您需要像这样修改响应:

<?php header('Access-Control-Allow-Origin: *'); ?>

您可以将Header set Access-Control-Allow-Origin * 设置放在Apache 配置或htaccess 文件中。

应该注意的是,这会有效地禁用 CORS 保护,这很可能会使您的用户受到攻击。如果您不知道自己特别需要使用通配符,则不应使用它,而应将您的特定域列入白名单:

<?php header('Access-Control-Allow-Origin: http://example.com') ?>

【讨论】:

我会联系我的服务器提供商。谢谢 这有什么安全问题吗?例如,This answer 表示“出于安全原因,javascript 受“同源策略”的限制,例如,恶意脚本无法联系远程服务器并从您的站点发送敏感数据。” 太棒了,我只是把它放在我的 node.js 服务器文件中: response.writeHead(200, 'Content-Type': contentType, 'Access-Control-Allow-Origin': '*' );它奏效了。谢谢! JohnK,是的,通配符将允许任何域向您的主机发送请求。我建议将星号替换为您将在其上运行脚本的特定域。 有趣的是,您认为甚至不应该建议使用通配符@jfrej。这一切都取决于你的目标。例如,我们使用通配符(并发布此答案)的原因是因为我们正在构建一个嵌入式小部件供任何网站使用。【参考方案2】:

如果您没有控制服务器,您可以简单地将这个参数添加到您的 Chrome 启动器:--disable-web-security

请注意,我不会将其用于正常的“网上冲浪”。参考这篇文章:Disable same origin policy in Chrome。

您使用 Phonegap 实际构建应用程序并将其加载到设备上,这不会是问题。

【讨论】:

谢谢。但是我的应用程序在移动设备上运行,我无法将参数传递给我的 webview 包装器。 您不先在浏览器中测试您的应用程序吗?你是怎么调试的? 是的,我在 Chrome 浏览器中调试,但该应用程序无法在 Chrome 上运行。它将在我无法控制的 phonegap webview 上。 阅读答案:您只需将此参数添加到您的 Chrome 启动器。 Chrome 里面没有这个设置 当然不安全。 OP 正在寻求绕过安全措施的方法。【参考方案3】:

如果您使用的是 Apache,只需添加:

<ifModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</ifModule>

在您的配置中。这将导致您的网络服务器的所有响应都可以从 Internet 上的任何其他站点访问。如果您打算只允许特定服务器使用您主机上的服务,您可以将 * 替换为原始服务器的 URL:

Header set Access-Control-Allow-Origin: http://my.origin.host

【讨论】:

别忘了加载模块:a2enmod headers 如何加载模块:a2enmod 头文件?【参考方案4】:

如果您有 ASP.NET / ASP.NET MVC 应用程序,您可以通过 Web.config 文件包含此标头:

<system.webServer>
  ...

    <httpProtocol>
        <customHeaders>
            <!-- Enable Cross Domain AJAX calls -->
            <remove name="Access-Control-Allow-Origin" />
            <add name="Access-Control-Allow-Origin" value="*" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

【讨论】:

.NET MVC 人,看这里!我实际上要输入一个解决方案并在我的博客上指出这个答案,以便人们更容易找到它。没有什么比试图越过 .NET/MVC 的障碍并只找到 PHP/jQuery 解决方案更糟糕的了。谢谢@Caio-Proiete 为什么这对我不起作用?我正在使用 Chrome 并尝试从我的本地主机访问雅虎财务页面。 感谢它对我有用。我已经在服务器端代码项目(web.config)中添加了。【参考方案5】:

这是我尝试使用ASP.NET MVC 作为我的数据源解决相同问题时弹出的第一个问题/答案。我意识到这并不能解决PHP 的问题,但它的相关性足以产生价值。

我正在使用 ASP.NET MVC。 blog post from Greg Brant 为我工作。最终,您创建了一个属性 [HttpHeaderAttribute("Access-Control-Allow-Origin", "*")],您可以将其添加到控制器操作中。

例如:

public class HttpHeaderAttribute : ActionFilterAttribute

    public string Name  get; set; 
    public string Value  get; set; 
    public HttpHeaderAttribute(string name, string value)
    
        Name = name;
        Value = value;
    

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    
        filterContext.HttpContext.Response.AppendHeader(Name, Value);
        base.OnResultExecuted(filterContext);
    

然后使用它:

[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]
public ActionResult MyVeryAvailableAction(string id)

    return Json( "Some public result" );

【讨论】:

WebApi 2 现在内置了这个。 asp.net/web-api/overview/security/…【参考方案6】:

由于 Matt Mombrea 在服务器端是正确的,您可能会遇到另一个问题,即白名单拒绝。

您必须配置您的 phonegap.plist。 (我使用的是旧版本的phonegap)

对于cordova,命名和目录可能会有一些变化。但步骤应该大体相同。

首先选择支持文件> PhoneGap.plist

然后在“外部主机”下

添加一个条目,其值可能为“http://nqatalog.negroesquisso.pt” 我使用 * 仅用于调试目的。

【讨论】:

【参考方案7】:

这对于需要对“www”和“非 www”版本的引荐来源网址进行例外处理的人来说可能很方便:

 $referrer = $_SERVER['HTTP_REFERER'];
 $parts = parse_url($referrer);
 $domain = $parts['host'];

 if($domain == 'google.com')
 
         header('Access-Control-Allow-Origin: http://google.com');
 
 else if($domain == 'www.google.com')
 
         header('Access-Control-Allow-Origin: http://www.google.com');
 

【讨论】:

为我指出了用 azure 解决 ACAO 错误的正确方向。虽然我添加了允许的 googledrive 主机名。使用的 URL 必须是 googledrive 而不是 googledrive【参考方案8】:

如果您正在编写 Chrome 扩展程序并收到此错误,请确保您已将 API 的基本 URL 添加到您的 manifest.json 的 permissions block,例如:

"permissions": [
    "https://itunes.apple.com/"
]

【讨论】:

【参考方案9】:

这是因为same-origin policy。在Mozilla Developer Network 或Wikipedia 上查看更多信息。

基本上,在您的示例中,您只需要从nqatalog.negroesquisso.pt 加载http://nqatalog.negroesquisso.pt/login.php 页面,而不是localhost

【讨论】:

但是我需要从移动设备加载网络服务,我会绕过这个吗? 那么你需要做一些服务器端的改变或者使用 JSONP en.wikipedia.org/wiki/JSONP【参考方案10】:

我会给你一个简单的解决方案。就我而言,我无权访问服务器。在这种情况下,您可以更改 Google Chrome 浏览器中的安全策略以允许 Access-Control-Allow-Origin。这很简单:

    创建 Chrome 浏览器快捷方式 右键快捷方式图标->属性->快捷方式->目标

简单粘贴到"C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security

位置可能不同。现在通过单击该快捷方式打开 Chrome。

【讨论】:

【参考方案11】:

我在使用各种 API 时遇到过几次。通常快速解决方法是添加“&callback=?”到字符串的末尾。有时&符号必须是字符代码,有时是“?”:“?callback =?” (见Forecast.io API Usage with jQuery)

【讨论】:

【参考方案12】:

如果你在 apache 下,只需在你的目录中添加一个 .htaccess 文件,内容如下:

Header set Access-Control-Allow-Origin: *

Header set Access-Control-Allow-Headers: content-type

Header set Access-Control-Allow-Methods: *

【讨论】:

【参考方案13】:

在Ruby on Rails,你可以在控制器中做:

headers['Access-Control-Allow-Origin'] = '*'

【讨论】:

如果是 ajax 调用,你会把它放在什么控制器中?我可以查看更多代码上下文吗?【参考方案14】:

如果你在 Angular.js 中得到这个,那么确保你像这样转义你的端口号:

var Project = $resource(
    'http://localhost\\:5648/api/...', 'a':'b', 
        update:  method: 'PUT' 
    
);

有关更多信息,请参阅here。

【讨论】:

【参考方案15】:

您可以通过使浏览器在 HTTP OPTIONS 的响应中包含标头 Access-Control-Allow-Origin: * 来使其在不修改服务器的情况下工作。

在 Chrome 中,使用 this extension。如果您使用 Mozilla,请查看this answer。

【讨论】:

【参考方案16】:

我们在 chrome 中测试的 phonegap 应用程序也有同样的问题。 我们每天在打开 Chrome 之前使用下面的批处理文件的一台 Windows 机器。 请记住,在运行此之前,您需要从任务管理器中清除所有 chrome 实例,或者您可以选择 chrome 以不在后台运行。

BATCH:(使用 cmd)

cd D:\Program Files (x86)\Google\Chrome\Application\chrome.exe --disable-web-security

【讨论】:

【参考方案17】:

在 Ruby 中 Sinatra

response['Access-Control-Allow-Origin'] = '*' 

为所有人或

response['Access-Control-Allow-Origin'] = 'http://yourdomain.name' 

【讨论】:

【参考方案18】:

当您收到请求时,您可以

var origin = (req.headers.origin || "*");

当你必须回应时,请使用类似的东西:

res.writeHead(
    206,
    
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': origin,
    
);

【讨论】:

以上是关于Access-Control-Allow-Origin 不允许来源的主要内容,如果未能解决你的问题,请参考以下文章

PHP没有按顺序执行

跨域请求被阻止 Symfony/AngularJS

C# MVC js 跨域

PHP Ajax 跨域问题最佳解决方案

PHP Ajax 跨域问题最佳解决方案

PHP Ajax 跨域问题最佳解决方案