如果我在使用 cors 时添加标准 http 标头,为啥会预检请求?

Posted

技术标签:

【中文标题】如果我在使用 cors 时添加标准 http 标头,为啥会预检请求?【英文标题】:Why is request preflighted if I add a standard http header when using cors?如果我在使用 cors 时添加标准 http 标头,为什么会预检请求? 【发布时间】:2016-03-08 21:56:12 【问题描述】:

我需要添加一些常见的额外信息(需要与我们的大多数 http 请求一起发送)来跨域 http 请求,额外的数据是设备信息或位置信息之类的东西。我们目前正在为这些信息使用自定义 http 标头,但是自定义标头会使浏览器在真正的 http 请求之前发送预检请求,因此出于性能考虑,我们希望删除预检请求。我们首先考虑使用cookie,但是由于请求是跨域的,所以我们不能用javascript为我们的API的域设置cookie。然后我搜索了文档,据Mozilla docs:

特别是,在以下情况下会预检请求:

它使用 GET、HEAD 或 POST 以外的方法。此外,如果使用 POST 发送 Content-Type 以外的请求数据 application/x-www-form-urlencoded、multipart/form-data 或 text/plain, 例如如果 POST 请求使用 application/xml 或 text/xml,然后预检请求。

它在请求中设置自定义标头(例如,请求使用标头 比如X-PINGOTHER)

所以我想如果我使用很少使用的standard http header:“From”标头,它不会触发选项请求。但是在我测试之后,我发现我错了,“From”标头仍然触发选项请求。

所以我有两个问题:

    为什么标准的 http 标头会触发预检请求? 如何在不触发预检请求的情况下发送额外信息?

任何帮助将不胜感激。

【问题讨论】:

对于why 部分,请检查:***.com/a/16945321/550618 【参考方案1】:

阅读同一页面的上述部分,了解什么是不需要预检的“简单请求”:

除了用户代理自动设置的标头(例如ConnectionUser-Agent等)之外,唯一允许手动设置的标头是

Accept Accept-Language Content-Language Content-Type

“自定义标头”不是指“非标准标头”,它是指浏览器不自动设置的任何标头,除了这四个。

【讨论】:

为什么添加自定义标头时请求不再被视为“简单”?换句话说,添加标头时会产生哪些安全隐患,因此需要 CORS 机制?谢谢

以上是关于如果我在使用 cors 时添加标准 http 标头,为啥会预检请求?的主要内容,如果未能解决你的问题,请参考以下文章

添加授权标头时出现CORS错误

MarkLogic HTTP Server:设置 CORS 标头

没有将 Cors 标头添加到响应中

将单个 HTTP 标头的多个值添加到请求或响应的标准

将单个 HTTP 标头的多个值添加到请求或响应的标准

CORS 多个标头