从this Bugzilla thread(和also)可以看出,Firefox并不总是在POST请求中发送Origin标头。 The RFC声明不应将其发送到某些未定义的"隐私敏感的"上下文。 Mozilla定义了这些上下文here。
我想知道的是,这些是Firefox不会发送Origin标头的唯一情况。据我所知,它也不会在跨源POST请求中发送它(虽然Chrome和IE会发送),但我无法在文档中确认。它是否在某个我错过的地方列举?
答案 0 :(得分:23)
就规范所要求的内容而言,上述问题需要分为几个答案:
null
我怀疑Firefox所需的内容(它与规范不同)是枚举的。但就列举 spec 要求而言,这里详细分为两部分:
问题的答案浏览器何时必须发送Origin标头?:Origin
标头仅针对Fetch规范定义为{{3}的任何请求发送}:
CORS请求是包含
Origin
标头的HTTP请求。它无法被可靠地识别为参与CORS协议,因为Origin
标头也包含在方法既不GET
也不HEAD
的所有请求中。
要求浏览器为方法既不Origin
也不GET
的所有请求发送HEAD
标头的CORS request是:
如果设置了 CORS标志或 httpRequest的方法既不是
GET
也不是HEAD
,那么追加Origin
/ httpRequest 的来源,序列化和UTF-8编码,到httpRequest的标题列表。
因此,要求浏览器为所有 Origin
请求发送POST
,包括同源POST
(根据定义,在Fetch中实际上是“CORS”请求“ - 尽管它们是同源的。”
注意:以上介绍了由于actual statement in the Fetch spec,Fetch规范当前如何定义要求。在那之前,要求是不同的:
Origin
Origin
(没有CORS)发送来自<form>
的跨职位POST 所以我认为问题中描述的Firefox行为符合以前所需的规范,但不符合目前所需的规范。
浏览器必须发送Origin
标头的其他情况是使用“CORS标志”集进行请求的任何情况 - 就HTTP(S)请求而言change that was made to the spec on 2016-12-09。
XHR 始终将模式设置为cors
。但是使用Fetch API,可以使用mode
方法的init-object参数的fetch(…)
字段设置那些请求模式:
fetch("http://example.com", { mode: 'no-cors' }) // no Origin will be sent
除此之外,对于具有except when the request mode is navigate
, websocket
, same-origin
, or no-cors
( aka “CORS设置属性)的任何元素,HTML规范要求浏览器将请求模式设置为cors
(以及发送Origin
标题。
否则,对于发起请求的任何元素(脚本,样式表,图像,媒体元素),请求的模式默认为no-cors
,这意味着不会为它们发送Origin
标头。< / p>
以上是有关浏览器发送Origin
标题的条件的详细信息。
答案的下一部分是关于何时将原始值设置为null
。
null
与浏览器必须发送Origin
标头的要求不同的是浏览器必须将源设置为null
的要求,这些要求在以下规范中定义:
HTML规范使用术语a crossorigin
attribute并说明:
一个内部值,没有序列化,可以从中重新创建(它被序列化为&#34; null&#34;每个源的ASCII序列化),唯一有意义的操作是测试相等性。
换句话说,HTML规范中的每个地方都说 opaque origin ,您可以将其转换为null
。
HTML规范要求浏览器在以下情况下设置不透明原点或唯一来源:
img
elements) video
and audio
elements) data:
URL iframe
with a sandbox
attribute that doesn’t contain the value allow-same-origin
createDocument()
, etc. Fetch规范要求浏览器将原点设置为“全局唯一标识符”(在一种情况下,它基本上与“不透明原点”相同,基本上意味着null
...):
在以下情况下,URL规范要求浏览器设置不透明的原点:
blob:
URLs file:
URLs。但重要的是要理解,因为浏览器内部设置了一个不透明的来源 - 实质上是null
- 这并不一定意味着浏览器会发送Origin
标头。因此,请参阅此答案的第一部分,详细了解浏览器何时必须发送Origin
标题。