为啥 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 包含 Accept
和 Origin
标头,但它们不会验证这些标头是否包含在 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-urlencoded
、multipart/form-data
或 text/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,为啥它受到保护?