当http:// localhost是原点时致命的CORS

我坚持这个CORS问题,即使我设置服务器(nginx / node.js)与适当的标题。

我可以在Chromenetworking窗格中看到 – > Response Headers:

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

这应该做的伎俩。

这里是我现在用来testing的代码:

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

我明白了

 XMLHttpRequest cannot load http://stackoverflow.com/. Origin http://localhost is not allowed by Access-Control-Allow-Origin. 

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

Chrome 不支持本地主机的CORS请求 (从2010年开放的错误)。

为了解决这个问题,你可以使用像lvh.me这样的域名(指向127.0.0.1就像localhost),或者用--disable-web-security标志(假设你只是testing)来启动chrome。

真正的问题是,如果我们设置 – 允许 – 所有请求(OPTIONS&POST),Chrome将取消它。 下面的代码适用于我的POST和使用Chrome的LocalHost

 <?php if (isset($_SERVER['HTTP_ORIGIN'])) { //header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); header("Access-Control-Allow-Origin: *"); header('Access-Control-Allow-Credentials: true'); header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); } if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) header("Access-Control-Allow-Headers:{$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); exit(0); } ?> 

根据Per @ 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)。 我已将其更改为仅使用以下URLfilter来过滤本地主机 URL

 *://localhost:*/*