缺少 CORS 标头“Access-Control-Allow-Origin” - CORS 请求未成功

Posted

技术标签:

【中文标题】缺少 CORS 标头“Access-Control-Allow-Origin” - CORS 请求未成功【英文标题】:CORS header ‘Access-Control-Allow-Origin’ missing - CORS request did not succeed 【发布时间】:2021-12-19 09:16:35 【问题描述】:

我在从 localhost 调用远程 API 时遇到问题。

我正在使用nimble:restivus

https://github.com/kahmali/meteor-restivus

根据我正在设置的文档:

enableCors: true

为了允许从任何来源访问。但没有运气。

这是我在浏览器控制台中遇到的错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading 
the remote resource at http://192.168.18.20:9000/api/getUsers. 
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

这是我的服务器端代码:

myApi = new Restivus(
    
    apiPath: 'api/',
    enableCors: true,
    useDefaultAuth: false,
    prettyJson: true,
    defaultOptionsEndpoint: 
        action: function() 
            this.response.writeHead(201, 
                "Access-Control-Allow-Origin", "*",
                "Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Z-Key, Authorization"
                "Content-Type": "application/json",
                "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS"
            );
            this.done();
            return 
                status: "success",
                "data": 
                    "message": "We love OPTIONS"
                
            ;
        
    
);

这是我的客户端代码:

$.ajax
        (
          type: "POST",
          url: "https://example.com/api/getUsers",
          dataType: 'json',
          headers: 
            "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI"
          
          data: ,
          success: function ()
            alert('Thanks for your comment!'); 
          
        );

如果我在标头中不发送任何内容,则请求成功,否则会在浏览器控制台中出错。

谁能帮我解决这个问题?

【问题讨论】:

您的框架一定是配置错误,不知何故。不幸的是,我不熟悉 Restivus。您有机会在 Chrome 中进行测试吗?它也会在那里失败,但在我看来,Chrome 的 CORS 错误消息比 Firefox 提供的信息更多。 应该 "Access-Control-Allow-Origin", "*" 不是 "Access-Control-Allow-Origin": "*"(冒号而不是逗号)? 关于"Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Z-Key, Authorization"的相同评论。 【参考方案1】:

您需要添加 Access-Control-Allow-Credentials 标头,因为您要发送 Authorization 标头。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials

编辑:

抱歉,我忘了说,当您发送授权标头时,允许来源标头必须与请求域匹配。当标头为*时,所有请求都将被拒绝

【讨论】:

像这样:"Access-Control-Allow-Credentials:": "true"? 我试过了,但我收到了这个错误:跨域请求被阻止:同源策略不允许读取192.168.18.20:9000/api/getUsers 的远程资源。 (原因:缺少 CORS 标头“Access-Control-Allow-Origin”) 抱歉,请参阅编辑。 我尝试使用此“Access-Control-Allow-Origin”:“192.168.18.20:5000”,但仍然出现同样的错误:Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at @ 987654324@。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。 对于合格的来源,您需要添加协议。

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

即使存在标头,CORS 也会失败

即使存在标头,CORS 也会失败

在 IE10 的 AJAX CORS 请求中添加自定义标头时,CORS 请求中止

缺少 CORS 400 标头(以及其他问题)

django-cors-headers 和 nginx 配置:预检响应缺少 CORS 标头

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