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

我在Sencha Touch 2应用程序(包装在PhoneGap中 )中向远程PHP服务器发送Ajax.request

来自服务器的响应如下:

XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php 。 Access-Control-Allow-Origin不允许源http://localhost:8888

我该如何解决这个问题?

我在这个问题上写了一篇关于Cross Domain AJAX的文章 。

如果您有对响应服务器的控制权,处理这种情况的最简单方法是为以下内容添加响应标头:

 Access-Control-Allow-Origin: * 

这将允许跨域Ajax 。 在PHP中,您将需要修改响应,如下所示:

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

您可以将Header set Access-Control-Allow-Origin *设置为Apacheconfiguration或htaccess文件。 它就像一个魅力。

从评论,这是一个重要的说明: 通配符将允许任何域发送请求到您的主机。 我build议将星号replace为您要运行脚本的特定域

如果您无法控制服务器,则可以简单地将此参数添加到Chrome启动器:– --disable-web-security

请注意,我不会使用这个正常的“网上冲浪”。 有关参考,请参阅此post: 在Chrome中禁用相同的来源政策 。

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

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

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

在你的configuration中。 这将导致从您的networking服务器的所有响应可以从互联网上的任何其他网站访问。 如果您打算只允许特定服务器使用主机上的服务,则可以使用源服务器的URLreplace*

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

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

我正在使用ASP.NET MVC。 格雷格·布兰特的博客文章为我工作。 最终,您可以创build一个属性,您可以将其添加到控制器操作的[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" ); } 

如果你有一个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> 

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

你必须configuration你的phonegap.plist。 (我正在使用老版本的phonegap)

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

首先select支持文件> PhoneGap.plist

在这里输入图像描述

然后在“ExternalHosts”下

添加一个条目,其值可能是“ http://nqatalog.negroesquisso.pt ”,我只用于debugging目的。

在这里输入图像描述

我会给你一个这个简单的解决scheme。 在我的情况下,我没有访问服务器。 在这种情况下,您可以更改Google Chrome浏览器中的安全政策,以允许访问控制允许来源。 这很简单:

  1. 创build一个Chrome浏览器快捷方式
  2. 右击快捷方式图标 – >属性 – >快捷方式 – >目标

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

地点可能会有所不同。 现在点击该快捷方式打开Chrome。

对于需要针对引荐来源的“www”和“non-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'); } 

如果您正在编写Chrome扩展程序并发生此错误,请确保您已将API的基本URL添加到您的manifest.json的权限块中 ,例如:

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

在使用各种AP​​I时,我遇到过几次这样的问题。 通常快速修复是添加“&callback =?” 到一个string的末尾。 有时和号必须是字符代码,有时是“?”:“?callback =?” (请参阅jQuery的Forecast.io API使用情况 )

这是因为同源政策 。 查看更多在Mozilla开发者networking或维基百科 。

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

在Ruby on Rails中 ,您可以在控制器中执行以下操作:

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

您可以在不修改服务器的情况下使其工作,方法是在HTTP OPTIONS的响应中包含头部Access-Control-Allow-Origin: *

在Chrome中,请使用此扩展程序 。 如果你在Mozilla上检查这个答案 。

我们在Chrome中也有同样的问题。 在打开Chrome之前,我们每天在batch file中使用一台Windows机器。 请记住,在运行此操作之前,您需要从任务pipe理器中清除chrome的所有实例,或者可以selectchrome以不在后台运行。

BATCH :(使用cmd)

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

如果你是在Apache下,只需要添加一个.htaccess文件到你的目录下面:

标题集Access-Control-Allow-Origin:*

标题集Access-Control-Allow-Headers:content-type

标题集Access-Control-Allow-Methods:*

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

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

在这里看到更多的信息。

在Ruby Sinatra

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

为每个人或…

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

当你收到请求时,你可以

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

比当你必须回应类似这样的事情:

 res.writeHead( 206, { 'Access-Control-Allow-Credentials': true, 'Access-Control-Allow-Origin': origin, } ); 
  **Add this meta tag in your Webservice** header('Content-type: application/json'); header('Access-Control-Allow-Origin: *'); 

通配符不是一个非常安全的选项。 你会希望它更具体 – 检查我在这里写的关于同一个问题的答案; 如何绕过Access-Control-Allow-Origin?