为啥我得到原因:成功返回数据时缺少 CORS 标头“Access-Control-Allow-Origin”

Posted

技术标签:

【中文标题】为啥我得到原因:成功返回数据时缺少 CORS 标头“Access-Control-Allow-Origin”【英文标题】:Why I get Reason: CORS header 'Access-Control-Allow-Origin' missing while data is returned successfully为什么我得到原因:成功返回数据时缺少 CORS 标头“Access-Control-Allow-Origin” 【发布时间】:2019-05-05 14:42:45 【问题描述】:

我知道这个问题在SO 已经被问过很多次了,但这个问题完全不同!

作为Mozilla itself says 的标题,您必须在nginx 中进行如下设置:

add_header 'Access-Control-Allow-Origin' 'origin-list'

我已经设置了CORS 选项,有趣的是preflight request 成功了:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Origin,Content-Type,Accept,authorization,Expires,Pragma,x-custom-header
Access-Control-Allow-Methods: GET, POST, OPTIONS, PATCH
Access-Control-Allow-Origin: https://localhost:3000

端点是/user。现在实际的 GET 请求被发送到服务器,它再次成功,200 响应代码 JSON 有效载荷它预期!

问题在于我想从jQuery 中获取这些数据,如下所示:

$.ajax(
        type: "GET",
        url: url_endpoint,
        beforeSend: function(request) 
            request.setRequestHeader("Authorization", "Bearer " + _TOKEN);
        ,
        dataType: "json",
        error: function (data, stat)  
            console.log('got error data: ', stat);
            console.log(data);
        ,
        complete: function(xhr, data) 
            console.log('here is the data...', data, xhr);
        
    ).catch(function(data,x,y) 
        console.log(data,x,y,'it seems request has error!!!!');
    );

它会记录请求的错误部分,例如 catch 内部,在控制台中我看到以下错误:

跨域请求被阻止:同源策略不允许读取位于https://www.example.com/restapi/user 的远程资源。 (原因:缺少 CORS 标头“Access-Control-Allow-Origin”)。[了解更多]

当我解释在OPTIONS 中返回标头时,它显示标头丢失。为了确保此错误与此特定请求相关,我注释掉了 /user 请求和 CORS 的错误消失了。

为什么我得到CORSOPTIONS 的服务器响应为204 以及为什么我得到CORS 而json 响应为/user 返回

【问题讨论】:

您确定您的电话来自localhost:3000?您是否尝试过 Access-Control-Allow-Origin: * 只是为了测试以确保 CORS 标头正常工作? @RoryMcCrossan - 我希望如果OPTIONS 调用不是来自允许的来源,浏览器甚至不会发出GET。但它在 OP 的示例中。 很高兴看到一个好的 CORS问题... 确实如此。对两个 cmets :) @RoryMcCrossan,是的,我将它设置为'*',它在OPTIONS 响应中给出* 【参考方案1】:

CORS 标头必须伴随对GET 的响应,而不仅仅是对OPTIONS 的响应。例如,您发送两次(如果有预检)。

【讨论】:

以上是关于为啥我得到原因:成功返回数据时缺少 CORS 标头“Access-Control-Allow-Origin”的主要内容,如果未能解决你的问题,请参考以下文章

仅在 Angular 资源请求中缺少 CORS 标头

为啥需要访问控制公开标头?

为啥需要访问控制公开标头?

为啥 CORS AJAX 响应中的响应标头为空?

我得到 angularjs 中缺少 CORS 标头“Access-Control-Allow-Origin”

跨域请求被阻止:(原因:缺少 CORS 标头“Access-Control-Allow-Origin”)