为什么我的 http://localhost CORS 来源不起作用?

IT技术 javascript html cors xmlhttprequest xmlhttprequest-level2
2021-01-24 07:31:09

即使我使用适当的标头设置了服务器(nginx/node.js),我仍然遇到了这个 CORS 问题。

我可以在 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

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

6个回答

Chrome不支持 localhost 的 CORS 请求(一个在 2010 年打开的错误,在 2014 年标记为 WontFix)。

要解决此问题,您可以使用类似的域localho.st(它指向 127.0.0.1,就像 localhost 一样)或使用--disable-web-security标志启动 chrome (假设您只是在测试)。

我在使用 FireFox 时遇到了同样的问题。我只能在 Edge 上做到!不错的帖子,太棒了!:)
2021-03-23 07:31:09
该错误无效(并已被标记为无效 - crbug.com/67743#c17)。Esilija 的评论是正确的,将这些标头添加到 localhost 不会神奇地让您访问所有其他站点。这是需要使用这些标头提供服务的远程站点。
2021-03-27 07:31:09
请参阅下面@Molomby 的评论“Chrome 100% 确实支持与本地主机之间的跨域请求......”
2021-04-03 07:31:09
@greensuisse - 它没有发布到本地主机。这是本地主机发布的问题。
2021-04-06 07:31:09
其他选项:编辑您的主机文件,使 local.[mysite].com 指向 127.0.0.1,然后使您的 CORS 文件允许 *.[mysite].com
2021-04-08 07:31:09

根据@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:*/*
如果您阅读问题 @beau 链接,您会看到 Chrome 100% 确实支持与 localhost 之间的跨域请求。该问题已于 2014 年关闭,因为无法重现。该线程中的其余噪音是非源服务器配置错误的人(就像这里的原始问题一样)。
2021-03-10 07:31:09
此扩展程序无法使用,Access-Control-Allow-Credentials: true因为它设置Access-Control-Allow-Origin*并同时拥有两者true*并且被浏览器阻止。如果使用凭据为真,则必须使用非通配符来源。我推荐 Moesif Origins 和 CORS Changer Extension,它允许您随意更改标题。
2021-03-11 07:31:09
在 chrome 上对我来说很有魅力
2021-03-25 07:31:09
@Chiwda 您可以在此处找到上述内容并加载更多内容:addons.mozilla.org/en-GB/firefox/search/...
2021-04-04 07:31:09

没有一个扩展对我有用,所以我安装了一个简单的本地代理。在我的情况下https://www.npmjs.com/package/local-cors-proxy 这是一个 2 分钟的设置:

(来自他们的网站)

npm install -g local-cors-proxy

我们要请求的具有 CORS 问题的 API 端点: https://www.yourdomain.ie/movies/list

启动代理: lcp --proxyUrl https://www.yourdomain.ie

然后在您的客户端代码中,新的 API 端点: http://localhost:8010/proxy/movies/list

对我来说就像一个魅力:你的应用程序调用代理,代理调用服务器。零 CORS 问题。

这对我来说就像一种魅力。非常感谢。
2021-03-17 07:31:09
为我工作(http 服务器位于 http://localhost:81/sse):lcp --proxyUrl http://localhost:81/sse。在代码中更改为 http://localhost:8010/proxy/sse(由 lcp 在命令行中提供给您。
2021-04-02 07:31:09

真正的问题是,如果我们-Allow-为所有请求(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);
} 
?>
OP 正在使用 nginx/node.js。不是 PHP
2021-03-13 07:31:09

Chrome 将使用来自localhost源的CORS 发出请求这不是 Chrome 的问题。

您无法加载的原因http://stackoverflow.comAccess-Control-Allow-Origin标题不允许您的localhost来源。