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