Javascript CORS - 不存在“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】Javascript CORS - 不存在“Access-Control-Allow-Origin”标头【英文标题】:Javascript CORS - No 'Access-Control-Allow-Origin' header is present 【发布时间】:2016-10-30 03:56:03 【问题描述】:

我一直在使用 CORS,遇到了以下问题。 客户端抱怨不存在“Access-Control-Allow-Origin”标头,而 它们存在,并且 客户端发出实际的 POST 请求收到 200。

function initializeXMLHttpRequest(url)   //the code that initialize the xhr
    var xhr = new XMLHttpRequest();
    xhr.open('POST', url, true);
    xhr.withCredentials = true;
    xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');

    //set headers
    for (var key in headers) 
        if (headers.hasOwnProperty(key))   //filter out inherited properties
            xhr.setRequestHeader(key,headers[key]);
        
    

        return xhr;

在 Chrome 中

chrome 控制台日志

Chrome 选项请求

Chrome POST 请求

在火狐中

Firefox 控制台日志

Firefox 选项请求

Firefox POST 请求

【问题讨论】:

【参考方案1】:

Access-Control-Allow-Origin 的值 null 不行,它必须是源域或 * 以允许任何源

更多详情,refer to MDN。

【讨论】:

我已将其设置为原始域。但是 localhost 也有这个问题。 (本地主机请求其他域的资源。)【参考方案2】:

简而言之:访问控制标头(例如 Access-Control-Allow-Origin)需要在响应 OPTIONS 和实际 POST 时出现。

工作流程:

    Client 使用这些 HTTP 访问标头发出 OPTIONS 请求。 (例如Origin, Access-Control-Request-Method, Access-Control-Request-Headers

    服务器响应这些访问控制标头,允许访问。 (例如Access-Control-Allow-Origin, Access-Control-Expose-Headers, Access-Control-Max-Age, Access-Control-Allow-Credentials, Access-Control-Allow-Methods, Access-Control-Allow-Headers

    客户端使用数据发出 POST 请求。

    服务器响应 POST。如果服务器响应中不存在 Access-Control-Allow-Origin 标头。虽然 POST 成功并在网络选项卡中显示 200 状态代码,但 xhr.status 为 0 并且将触发 xhr.onerror。浏览器会显示错误消息。

标题参考: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

【讨论】:

以上是关于Javascript CORS - 不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

CORS 标头“Access-Control-Allow-Origin”缺少 Laravel 5.4

在 javascript 中使用 fetch 请求 API 存在 CORS 策略错误

javascript中CORS的htaccess

如何检查或验证 URL 是不是存在 - 返回 CORS 错误?

laravel cors“类cors不存在”错误

ASP.NET 5 beta7 CORS 不工作