如果我在使用 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】:
阅读同一页面的上述部分,了解什么是不需要预检的“简单请求”:
除了用户代理自动设置的标头(例如
Connection
、User-Agent
等)之外,唯一允许手动设置的标头是Accept
Accept-Language
Content-Language
Content-Type
“自定义标头”不是指“非标准标头”,它是指浏览器不自动设置的任何标头,除了这四个。
【讨论】:
为什么添加自定义标头时请求不再被视为“简单”?换句话说,添加标头时会产生哪些安全隐患,因此需要 CORS 机制?谢谢以上是关于如果我在使用 cors 时添加标准 http 标头,为啥会预检请求?的主要内容,如果未能解决你的问题,请参考以下文章