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浏览器中的安全政策,以允许访问控制允许来源。 这很简单:
- 创build一个Chrome浏览器快捷方式
- 右击快捷方式图标 – >属性 – >快捷方式 – >目标
简单的粘贴在"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'); }
如果你正在使用chromer使用这个插件
如果您正在编写Chrome扩展程序并发生此错误,请确保您已将API的基本URL添加到您的manifest.json
的权限块中 ,例如:
"permissions": [ "https://itunes.apple.com/" ]
在使用各种API时,我遇到过几次这样的问题。 通常快速修复是添加“&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?