Http 浏览器何时发送源标题?浏览器何时将原点设置为空?
正如您从(和)中看到的,Firefox并不总是在POST请求中发送源标题。声明不应在某些未定义的“隐私敏感”上下文中发送。Mozilla定义了这些上下文Http 浏览器何时发送源标题?浏览器何时将原点设置为空?,http,firefox,cors,cross-domain,fetch-api,Http,Firefox,Cors,Cross Domain,Fetch Api,正如您从(和)中看到的,Firefox并不总是在POST请求中发送源标题。声明不应在某些未定义的“隐私敏感”上下文中发送。Mozilla定义了这些上下文 我想知道是否只有在这些情况下Firefox才会不发送源文件头。据我所知,它也不会在跨源POST请求中发送它(尽管Chrome和InternetExplorer会),但我无法在文档中确认这一点。是否列举了我遗漏的地方?根据相关规范的实际要求,答案有几个部分: 浏览器必须在内部将原点设置为一个值,该值将被序列化为null 当浏览器必须发送源标题时
我想知道是否只有在这些情况下Firefox才会不发送源文件头。据我所知,它也不会在跨源POST请求中发送它(尽管Chrome和InternetExplorer会),但我无法在文档中确认这一点。是否列举了我遗漏的地方?根据相关规范的实际要求,答案有几个部分:
- 浏览器必须在内部将原点设置为一个值,该值将被序列化为
null
- 当浏览器必须发送源标题时
null
HTML规范使用该术语并将其定义为“内部值”:
在没有序列化的情况下,可以从中重新创建它(它被序列化为“null”,每个源的ASCII序列化),对于它,唯一有意义的操作是测试是否相等
换言之,HTML规范所说的不透明原点的任何地方,您都可以将其转换为null
HTML规范要求浏览器在以下情况下设置不透明原点或唯一原点:
Fetch规范要求浏览器将原点设置为“全局唯一标识符”(这基本上与“不透明原点”的含义相同,后者基本上表示null
…):
URL规范要求浏览器在以下情况下设置不透明原点:
但请注意,仅仅因为浏览器在内部设置了一个不透明的原点(本质上是null
),这并不一定意味着浏览器将发送一个原点
标题。因此,有关浏览器何时必须发送Origin
标题的详细信息,请参阅本答案的下一部分
当浏览器必须发送源标题时 对于由
fetch()
或XHR调用启动的跨源请求,或通过JavaScript库(axios、jQuery等)中的ajax方法启动的跨源请求,浏览器会发送Origin
头,但对于正常的页面导航(即,当您直接在浏览器中打开网页时),对于嵌入在网页中的资源,浏览器不会发送Origin头(例如,不适用于CSS样式表、脚本或图像)
但这种描述只是一种简化。当浏览器发送origin
头时,除了跨源XHR/fetch/ajax调用外,还有一些情况是浏览器发送嵌入式资源的origin
头。因此,下面是较长的答案
就规范要求而言:规范要求仅针对Fetch规范定义为以下内容的任何请求发送Origin
头:
CORS请求是一个HTTP请求,它包含一个Origin
头。由于Origin
头也包含在方法既不是GET
也不是HEAD
的所有请求中,因此无法可靠地将其识别为参与CORS协议
因此,规范的含义是:Origin
头在所有跨源请求中发送,但它也总是针对所有POST
、PUT
、PATCH
、和DELETE
请求发送,即使是对于相同的OriginPOST
、PUT
、PATCH
、和DELETE代码>请求(根据Fetch中的定义,这些请求实际上是“CORS请求”-即使它们的来源相同)
浏览器必须发送Origin
报头的其他情况是使用“CORS标志”集发出请求的任何情况,就HTTP(S)请求而言,该标志是无效的
XHR总是将模式设置为cors
。但是对于Fetch API,这些请求模式是可以使用Fetch(…)
方法的init object参数的mode
字段设置的:
fetch("http://example.com", { mode: 'no-cors' }) // no Origin will be sent
字体请求始终将模式设置为cors
,因此始终具有原始
标题
对于任何具有(又名“CORS setting attribute”)的元素,HTML规范要求浏览器将请求模式设置为CORS
(并发送Origin
标题)
否则,对于嵌入式资源-任何具有URL属性的元素,这些URL会启动请求(
、样式表、图像、媒体元素)-请求的模式默认为no cors
;由于这些请求是GET
请求,这意味着,根据规范,浏览器不会为它们发送Origin
头
当HTML表单元素启动POST
请求时,那些POST
s的模式也默认为no-cors
——就像嵌入式资源的模式默认为no-cors
。然而,与no-cors
模式GET
请求嵌入式资源不同,浏览器发送对于那些从HTML表单元素启动的no-cors
modePOST
s的Origin
标题
原因是,如本答案前面所述,浏览器总是在所有POST
、PUT
、PATCH
和DELETE
请求中发送Origin
标题
此外,为了此处的完整性和明确起见:对于导航,浏览器不发送Origin
标题。也就是说,如果用户直接导航到资源-通过将URL粘贴到浏览器地址栏中,或通过跟踪来自另一个网站的链接