【问题标题】:Why CORS request succeeds even if Access-Control-Allow-Headers is missing?为什么即使缺少 Access-Control-Allow-Headers,CORS 请求也会成功?
【发布时间】:2012-08-08 07:52:39
【问题描述】:

引用Opera documentation(我找到的第一个链接):

标准或自定义标题是合适的值 访问控制允许标头。为了使跨域请求成功, 它的值必须匹配(或包括) Access-Control-Request-Headers 标头。

我正在使用 jQuery 发送请求。如果我注释掉setRequestHeader:

$(function() {            
    $.ajax({
        url: 'http://silex.local/users',
        method: 'GET',
        beforeSend : function(req) {
            //req.setRequestHeader('Authorization', 'FID ds7sd6:32n8942b3672n2');
        }
    });
});

它不应该工作,因为 服务器正在响应

HTTP/1.0 200 OK
Date: Sat, 11 Aug 2012 02:15:14 GMT
Server: Apache/2.2.22 (Win32) PHP/5.3.14
X-Powered-By: PHP/5.3.14
Cache-Control: no-cache
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE
Access-Control-Allow-Headers: Authorization
Connection: close
Content-Type: application/json; charset=utf-8

当客户请求时:

GET http://silex.local/users HTTP/1.1
Host: silex.local
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: */*
Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Proxy-Connection: keep-alive
Referer: http://localhost/test.html
Origin: http://localhost
Cache-Control: max-age=0

我错过了什么?抱歉,如果这是一个奇怪的问题,我第一次使用 CORS...

【问题讨论】:

标签: jquery http http-headers cors


【解决方案1】:

我认为您误解了 Access-Control-Allow-Headers 的作用(措辞不佳的引述无济于事)。它允许服务器告诉浏览器哪些标头是可接受的,以便设置跨域 XHR 请求。

这并不意味着这些标题是强制性的。如果脚本没有设置标头,请求仍然允许发生。

【讨论】:

  • 嗯..谢谢。这是Opera doc中的一个大错误?因为“要使跨域请求成功,其值必须与 Access-Control-Request-Headers 标头的值匹配。”确切地说是mandatory
  • 我认为它的意思是,如果您的脚本试图设置一个不在Access-Control-Allow-Headers 允许的集合中的标头,那么请求将失败。 (虽然我想知道它是否真的会失败或者只是不发送标头。)
猜你喜欢
  • 1970-01-01
  • 2021-12-19
  • 2019-12-10
  • 2015-11-26
  • 2016-09-30
  • 2016-11-24
  • 2020-02-26
  • 2014-08-04
  • 2018-03-28
相关资源
最近更新 更多