我在做一个Ajax。请求一个远程PHP服务器在Sencha Touch 2应用程序(包装在PhoneGap)。

服务器的响应如下:

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

我该如何解决这个问题?


当前回答

我曾经写过一篇关于这个问题的文章,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') ?>

其他回答

当您收到请求时,您可以

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

而当你不得不这样回答的时候:

res.writeHead(
    206,
    {
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': origin,
    }
);

这是因为同源政策。详见Mozilla开发者网络或维基百科。

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

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

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

更多信息请看这里。

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

我曾经写过一篇关于这个问题的文章,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') ?>