我被这个CORS问题困住了,即使我用适当的头设置了服务器(nginx/node.js)。

我可以看到在Chrome网络窗格->响应头:

Access-Control-Allow-Origin:http://localhost

这应该能奏效。

下面是我现在用来测试的代码:

var xhr = new XMLHttpRequest();
xhr.onload = function() {
   console.log('xhr loaded');
};
xhr.open('GET', 'http://stackoverflow.com/');
xhr.send();

我得到

XMLHttpRequest无法加载http://stackoverflow.com/。Access-Control-Allow-Origin不允许Origin http://localhost。

我怀疑这是客户端脚本的问题,而不是服务器配置…


当前回答

Chrome将使用来自本地主机的CORS发出请求。这不是Chrome的问题。

你不能加载http://stackoverflow.com的原因是Access-Control-Allow-Origin头文件不允许你的本地主机来源。

其他回答

Chrome将使用来自本地主机的CORS发出请求。这不是Chrome的问题。

你不能加载http://stackoverflow.com的原因是Access-Control-Allow-Origin头文件不允许你的本地主机来源。

根据@Beau的回答,Chrome不支持本地主机CORS请求,在这个方向上不太可能有任何变化。

我使用Allow-Control-Allow-Origin: * Chrome扩展来解决这个问题。扩展将为CORS添加必要的HTTP头:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: "GET, PUT, POST, DELETE, HEAD, OPTIONS"
Access-Control-Expose-Headers: <you can add values here>

源代码发布在Github上。

注意,默认情况下扩展过滤所有url。这可能会破坏一些网站(例如:Dropbox)。我将其更改为仅使用以下URL过滤器过滤本地主机URL

*://localhost:*/*

快速和肮脏的Chrome扩展修复:

Moesif源& CORS变换器

但是,Chrome确实支持来自本地主机的跨源请求。确保为localhost添加Access-Control-Allow-Origin标题。

我想我的解决办法可能是最简单的。在我的开发机器上,我在hosts文件中添加了一个类似于http://myfakedomain.notarealtld的假域,并将其设置为127.0.0.1。然后我更改了服务器的CORS配置(在我的例子中是S3桶)以允许该域。这样我就可以在localhost上使用Chrome,它工作得很好。

确保您的CORS配置考虑到整个主机名与端口,即。http://myfakedomain.notarealtld:3000

您可以轻松地在Linux、Mac和Windows上修改主机文件。

解决方案是安装一个扩展,以提升Chrome的块,例如:

Access Control-Allow-Origin - Unblock (https://add0n.com/access-control.html?version=0.1.5&type=install)。