我正在Sencha Touch 2 应用程序(包装在PhoneGap 中)Ajax.request
中创建一个远程 PHP 服务器。
来自服务器的响应如下:
XMLHttpRequest 无法加载http://nqatalog.negroesquisso.pt/login.php。原产地
http://localhost:8888
不被访问控制允许来源允许的。
我该如何解决这个问题?
我正在Sencha Touch 2 应用程序(包装在PhoneGap 中)Ajax.request
中创建一个远程 PHP 服务器。
来自服务器的响应如下:
XMLHttpRequest 无法加载http://nqatalog.negroesquisso.pt/login.php。原产地
http://localhost:8888
不被访问控制允许来源允许的。
我该如何解决这个问题?
不久前我写了一篇关于这个问题的文章,跨域 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>
在您的配置中。这将导致您的网络服务器的所有响应都可以从互联网上的任何其他站点访问。如果您打算只允许特定服务器使用您主机上的服务,您可以将 替换*
为原始服务器的 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问题,但它足够有value。
我正在使用 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" );
}