我正在Ajax.request
使用Sencha Touch 2应用程序(包装在PhoneGap中)到远程PHP服务器。
来自服务器的响应如下:
XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php。原产地
http://localhost:8888
不被访问控制允许来源允许的。
我该如何解决这个问题?
Access-Control-Allow-Origin
其报告为错误。
我正在Ajax.request
使用Sencha Touch 2应用程序(包装在PhoneGap中)到远程PHP服务器。
来自服务器的响应如下:
XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php。原产地
http://localhost:8888
不被访问控制允许来源允许的。
我该如何解决这个问题?
Access-Control-Allow-Origin
其报告为错误。
Answers:
不久前,我写了一篇有关此问题的文章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') ?>
如果您无法控制服务器,则只需将此参数添加到您的Chrome启动器中:--disable-web-security
。
请注意,我不会将其用于常规的“网络冲浪”。作为参考,请参阅这篇文章:在Chrome中禁用同一来源策略。
您可以使用Phonegap实际构建应用程序并将其加载到设备上,这不会成为问题。
如果您使用的是Apache,只需添加:
<ifModule mod_headers.c>
Header set Access-Control-Allow-Origin: *
</ifModule>
在您的配置中。这将使您可以从Internet上的任何其他站点访问来自Web服务器的所有响应。如果您打算仅允许主机上的服务由特定服务器使用,则可以将替换*
为原始服务器的URL:
Header set Access-Control-Allow-Origin: http://my.origin.host
如果您有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>
这是我尝试使用ASP.NET MVC作为数据源来解决相同问题时出现的第一个问题。我意识到这并不能解决PHP问题,但它具有足够的相关性,因此很有价值。
我正在使用ASP.NET MVC。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" );
}
由于Matt Mombrea在服务器端是正确的,因此您可能会遇到另一个问题,即将拒绝列入白名单。
您必须配置phonegap.plist。(我使用的是旧版的phonegap)
对于cordova,命名和目录可能会有一些更改。但是步骤应该大致相同。
首先选择支持文件> PhoneGap.plist
然后在“外部主机”下
添加一个条目,其值可能为“ http://nqatalog.negroesquisso.pt ”。我仅将*用于调试目的。
这对于需要为引荐来源网址的“ 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');
}
我将为您提供一个简单的解决方案。就我而言,我无权访问服务器。在这种情况下,您可以在Google Chrome浏览器中更改安全策略以允许Access-Control-Allow-Origin。这很简单:
简单粘贴"C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security
。
位置可能会有所不同。现在,点击该快捷方式打开Chrome。
在使用各种API时,我已经遇到过几次。通常,快速解决方案是添加“&callback =?” 到字符串的末尾。有时,“&”号必须是字符代码,有时是“?”:“?callback =?” (请参阅jQuery的Forecast.io API使用情况)
这是由于同源政策。在Mozilla开发人员网络或Wikipedia上查看更多内容。
基本上,在您的示例中,您http://nqatalog.negroesquisso.pt/login.php
仅需要从而nqatalog.negroesquisso.pt
不是加载页面localhost
。
在Ruby on Rails中,您可以在控制器中执行以下操作:
headers['Access-Control-Allow-Origin'] = '*'
在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,
}
);
dataType: 'jsonp',
可以解决问题