为啥 Access-Control-Request-Headers 中包含非自定义标头?

Posted

技术标签:

【中文标题】为啥 Access-Control-Request-Headers 中包含非自定义标头?【英文标题】:Why are non-custom headers included in Access-Control-Request-Headers?为什么 Access-Control-Request-Headers 中包含非自定义标头? 【发布时间】:2013-06-24 04:42:28 【问题描述】:

我正在尝试发送跨域请求。就 Access-Control-Request-Headers 而言,我在 FireFox、Chrome 和 Safari 中的行为有所不同。

Chrome :- Access-Control-Request-Headers:  origin, content-type, accept
Safari :- Access-Control-Request-Headers:  origin, content-type, accept
Firefox:- Access-Control-Request-Headers:  content-type

我的问题是:-

    浏览器如何决定哪些标头将成为 Access-Control-Request-Headers 的一部分? 据我所知,Access-Control-Request-Headers 中应该只有自定义标头,但所有三个(accept、origin 和 content-type)都不是自定义标头。那么为什么它们是 Access-Control-Request-Headers 的一部分呢? 为什么行为会因浏览器而异?

【问题讨论】:

【参考方案1】:

这里有很多不同的事情,所以我一次回答一个。

Chrome 和 Safari 都基于 WebKit,这就是为什么您会在这些浏览器中看到相同的行为(Chrome 即将迁移到 Blink,但尚未掌握在用户手中)。

最新的 CORS 规范指出 Accept 是一个简单的请求标头。 Origin 不包含在简单请求标头列表中,但不支持它会很愚蠢,因为它是 CORS 的基础。所以从技术上讲,Firefox 正在做正确的事情。

但是请注意,尽管 Chrome/Safari 包含 AcceptOrigin 标头,但它们不会验证这些标头是否包含在 Access-Control-Allow-Headers 响应标头中。您可以通过访问以下链接来验证这一点:

http://client.cors-api.appspot.com/client#?client_method=PUT&client_credentials=false&client_headers=Accept%3A%20%2A%2F%2A&server_enable=true&server_status=200&server_credentials=false&server_methods=PUT&server_tabs=local

请注意,预检请求具有标头Access-Control-Request-Headers: accept, origin,但响应中没有Access-Control-Allow-Headers。并且实际的 CORS 请求仍然成功。

Content-Type 标头仅在其值为以下之一时才被视为简单请求标头:application/x-www-form-urlencodedmultipart/form-datatext/plain。所有其他值将触发预检。这可能就是您在这里看到的。

我不知道为什么浏览器会这样。这可能是值得在 WebKit 或 Firefox 留言板上询问的内容。这是WebKit设置Access-Control-Request-Headers标头的代码:

https://trac.webkit.org/browser/trunk/Source/WebCore/loader/CrossOriginAccessControl.cpp?order=name#L117

它似乎列出了所有标题,而没有删除简单的标题。我想在响应端有代码只需要 Access-Control-Allow-Headers 响应中的非简单标头。

【讨论】:

嗨,我正在使用 chrome 设置标题值 dauth。但在提琴手中,它向我展示了 Access-Control-Request-Headers:content-type, dauth, x-akamai-acs-action。然而,如果我 --disbale-web-security for chrome 它向我显示 DAUTH:XXXXXXX 值....知道为什么它在之前的情况下不附加标头值

以上是关于为啥 Access-Control-Request-Headers 中包含非自定义标头?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?