到目前为止,所有答案似乎都是简化的,不完整的或部分错误的(主题很复杂,事物的名称令人迷惑并且没有充分记录!),所以这是我的理解:
为了能够重用由创建的连接<link rel=preconnect>
,取决于您要从何处获取哪种类型的内容,请求是否将发送浏览器凭据(可以由浏览器显式或隐式地建立):
请求的来源相同(example.com
请求来自的子资源example.com
)
首先根本不需要preconnect
。在加载页面一段时间后,浏览器使连接保持打开状态。如果要打开多个连接,浏览器将自行决定是否打开以及打开多少(取决于服务器是否在TLS握手,浏览器设置等中宣布HTTP / 2支持)。
要检查:如果同源请求具有crossorigin
属性:该属性是已使用还是被忽略?
该请求是跨源的(example.com
请求来自的子资源another.com
)
- 如果实际的请求具有在HTML中显式设置的
crossorigin
属性(在JS中,这很重要),则预连接也必须具有相同的值(也许在没有意义且被忽略的情况下除外)-对于我呢crossOrigin
crossorigin
- 否则,如果要求如果
<script type=module>
:进行检查
- 否则,如果请求和“老派”的要求
<img>
,<style type=stylesheet>
,<iframe>
,经典<script>
等(通过HTML或JS启动), 没有crossorigin
明确指定,那么PRECONNECT不能有crossorigin
属性集。
- 否则,如果请求是跨域字体请求,则预连接必须具有
crossorigin=anonymous
- 否则,如果请求是跨域的
fetch
或XHR
:
- 如果它是在凭证模式下完成的(即,附加了cookie或使用了HTTP基本身份验证;对于fetch,这意味着
credentials !== omit
;对于XHR :)withCredentials === true
:预连接必须具有crossorigin=use-credentials
- 如果它不在凭据模式下:预连接必须具有
crossorigin=anonymous
对于最后一种情况(fetch / XHR),请转到Chrome / Firefox devtools中的网络面板,右键单击请求,然后copy as fetch
从下拉菜单中选择。这将创建一个JS代码段,该代码段将告诉您该请求是否启用了CORS("mode"=="cors"
)和凭据("credentials"=="include"|"same-origin"
)。
但是请注意,上述技巧不适用于非XHR /获取请求,因为如前所述,例如fetch
,<img>
使用不同的算法来建立连接。
最后,在HTML中,<link ...crossorigin>
=== <link ...crossorigin=anonymous>
。
其他说明和链接: