当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:*/*