我在做一个Ajax。请求一个远程PHP服务器在Sencha Touch 2应用程序(包装在PhoneGap)。
服务器的响应如下:
XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php。Access-Control-Allow-Origin不允许Origin http://localhost:8888。
我该如何解决这个问题?
我在做一个Ajax。请求一个远程PHP服务器在Sencha Touch 2应用程序(包装在PhoneGap)。
服务器的响应如下:
XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php。Access-Control-Allow-Origin不允许Origin http://localhost:8888。
我该如何解决这个问题?
当前回答
我会给你一个简单的解决方法。就我而言,我没有访问服务器的权限。在这种情况下,您可以更改您的谷歌Chrome浏览器的安全策略,以允许访问控制-允许起源。这很简单:
创建Chrome浏览器快捷方式 右键单击快捷方式图标->属性->快捷方式->目标
简单的粘贴到“C:\Program Files\谷歌\Chrome\Application\ Chrome .exe”——allow-file-access-from-files——disable-web-security。
位置可能不同。现在通过点击快捷方式打开Chrome。
其他回答
我曾经写过一篇关于这个问题的文章,Cross Domain AJAX。
如果你有响应服务器的控制权,最简单的方法是添加一个响应头:
Access-Control-Allow-Origin: *
这将允许跨域Ajax。在PHP中,你需要像这样修改响应:
<?php header('Access-Control-Allow-Origin: *'); ?>
你可以把头集Access-Control-Allow-Origin *设置放在Apache配置或htaccess文件中。
应该注意的是,这将有效地禁用CORS保护,这很可能使您的用户暴露在攻击之下。如果你不知道你特别需要使用通配符,你不应该使用它,相反,你应该把你的特定域列入白名单:
<?php header('Access-Control-Allow-Origin: http://example.com') ?>
这是因为同源政策。详见Mozilla开发者网络或维基百科。
基本上,在您的示例中,您只需要从ncatalogg .negroesquisso.pt加载http://nqatalog.negroesquisso.pt/login.php页面,而不是从localhost加载。
如果你有ASP。Net / asp。NET MVC应用程序,您可以通过Web包含此头文件。配置文件:
<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>
当您收到请求时,您可以
var origin = (req.headers.origin || "*");
而当你不得不这样回答的时候:
res.writeHead(
206,
{
'Access-Control-Allow-Credentials': true,
'Access-Control-Allow-Origin': origin,
}
);
这可能对任何需要为引用器的'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');
}