P J*_*nes 12 firefox http cross-domain cors fetch-api
正如你可以看到从这个Bugzilla的线程(和也),Firefox不总是在POST请求发送Origin标.RFC规定不应在某些未定义的"隐私敏感"上下文中发送它.Mozilla 在这里定义了这些上下文.
我想知道的是,这些是Firefox不会发送Origin标头的唯一情况.据我所知它也不会发送它在跨源POST请求(虽然Chrome和IE将),但我无法在文档中确认.它是否在我遗漏的地方列举?
谢谢.
sid*_*ker 27
就规范要求而言,上述问题需要分为几个答案:
null
我怀疑Firefox所需要的是什么(它与规格不同)是枚举的.但就列举规范要求而言,它们在详尽的细节中分为两部分:
问题的答案什么时候浏览器必须发送Origin标头?is:Origin
仅针对Fetch规范定义为CORS请求的任何请求发送标头:
甲CORS请求是包括一个HTTP请求
Origin
报头.它不能被可靠地识别为参与CORS协议,因为Origin
对于方法既不是GET
也不是的所有请求也包括头HEAD
.
Fetch规范中的实际语句要求浏览器Origin
为其方法既不是GET
也不HEAD
是这样的所有请求发送标头:
如果设置了CORS标志或者httpRequest的方法既不
GET
是HEAD
,也将Origin
/ httpRequest的原始序列化和UTF-8编码附加到httpRequest的头列表中.
因此,需要浏览器发送Origin
的所有 POST
请求,包括同源POST
秒(根据定义在取实际上是"CORS请求" -甚至虽然他们同源).
注意:以上描述了Fetch规范当前如何定义需求,原因是2016-12-09对规范进行了更改.在那之前,要求是不同的:
Origin
发送同一个来源的POSTOrigin
从一个<form>
(没有CORS)发送跨来源POST所以我认为问题中描述的Firefox行为符合之前所需的规范,但不符合规范目前的要求.
当浏览器必须发送的其他情况下Origin
报头是其中请求与"CORS标志"所做的任何情况下,设置其中,据HTTP(S)请求是除了当请求模式是navigate
,websocket
,same-origin
,或no-cors
.
XHR 始终将模式设置为cors
.但是使用Fetch API,可以使用方法mode
的init-object参数字段设置这些请求模式fetch(…)
:
fetch("http://example.com", { mode: 'no-cors' }) // no Origin will be sent
Run Code Online (Sandbox Code Playgroud)
伴随于此,对于具有任何元件一个crossorigin
属性(又名 "CORS设置属性),HTML规范要求的浏览器,以请求模式设置为cors
(和发送Origin
报头).
否则,对于启动请求的任何元素(脚本,样式表,图像,媒体元素),请求的模式默认为no-cors
,这意味着没有Origin
为它们发送标头.
以上是有关浏览器发送Origin
标头的条件的详细信息.
答案的下一部分是关于何时将原始值设置为null
.
null
与浏览器必须发送Origin
标头的要求分开的是浏览器必须设置源的要求null
,这些要求在以下规范中定义:
HTML规范使用术语opaque origin并说明:
一个内部值,没有序列化,可以从中重新创建(根据源的ASCII序列化将其序列化为"null"),唯一有意义的操作是测试相等性.
换句话说,HTML规范到处都是不透明的原点,你可以将其转换为null
.
HTML规范要求浏览器在以下情况下设置不透明原点或唯一原点:
img
元素)video
和audio
元素)data:
URL 生成的任何文档iframe
具有sandbox
不包含值的属性的任何一个allow-same-origin
createDocument()
等.Fetch规范要求浏览器将原点设置为"全局唯一标识符"(null
在一种情况下,它基本上与"不透明原点"相同,这基本上意味着......):
URL规范要求浏览器在以下情况下设置不透明的原点:
但重要的是要理解,仅仅因为浏览器内部设置了一个不透明的来源 - 本质上null
- 这并不一定意味着浏览器将发送Origin
标题.因此,请参阅此答案的第一部分,了解有关浏览器何时必须发送Origin
标头的详细信息.
对我来说,这是在超标准表单 POST 到本地主机上的相对 URL 上发生的,并且似乎是通过
<meta name="referrer" content="no-referrer">
Run Code Online (Sandbox Code Playgroud)
在里面<head>
。
将其更改为
<meta name="referrer" content="same-origin">
Run Code Online (Sandbox Code Playgroud)
似乎让 Firefox 更快乐。
归档时间: |
|
查看次数: |
8102 次 |
最近记录: |