Все ответы до сих пор кажутся либо упрощенными, неполными или частично неправильными (тема сложная, вещи смущенно названы и плохо документированы!), Так что вот мое понимание:
Чтобы иметь возможность повторно использовать созданное соединение <link rel=preconnect>
, все зависит от того, какой тип контента вы хотите получить, откуда, будет ли запрос отправлять учетные данные браузера (которые могут быть установлены браузером явно или неявно):
Запрос того же происхождения ( example.com
запрашивает субресурс из example.com
)
Во preconnect
-первых , вообще не нужно ; браузер сохраняет соединение открытым после загрузки страницы в течение достаточно долгого времени. Если необходимо открыть несколько подключений, браузер сам решает, открывать ли и сколько (в зависимости от того, объявляет ли сервер поддержку HTTP / 2 при рукопожатии TLS, настройках браузера и т. Д.)
Подлежит проверке : что если запрос того же источника имеет crossorigin
атрибут: используется или игнорируется?
Запрос перекрестного происхождения ( example.com
запрашивает субресурс из another.com
)
- если фактический запрос имеет
crossorigin
атрибут, явно установленный в HTML ( crossOrigin
в JS - регистр важен), у предварительного соединения также должен быть его, с тем же значением (возможно, за исключением случаев, когда он не имеет смысла и crossorigin
игнорируется - не полностью ясно для мне пока)
- иначе, если запрос, если для
<script type=module>
: будет проверено
- иначе, если запрос и «старая школа» запрос
<img>
, <style type=stylesheet>
, <iframe>
, классический и <script>
т.д. (инициируемые с помощью HTML или JS) без crossorigin
явно указанного , то preconnect не должен иметь crossorigin
набор атрибутов.
- иначе, если запрос является запросом шрифта кросс-источника , предварительное соединение должно иметь
crossorigin=anonymous
- иначе, если запрос является кросс-источником
fetch
или XHR
:
- если это делается в режиме учетных данных (т. е. файлы cookie подключены или используется базовая аутентификация HTTP; в случае выборки это означает
credentials !== omit
; в случае withCredentials === true
XHR:): предварительное соединение должно иметьcrossorigin=use-credentials
- если он не в режиме учетных данных: preconnect должен иметь
crossorigin=anonymous
В последнем случае (выборка / XHR) перейдите на сетевую панель в Chrome / Firefox devtools, щелкните правой кнопкой мыши запрос и выберите copy as fetch
из выпадающего списка. Это создаст фрагмент JS, который скажет вам, является ли этот запрос CORS-enabled ( "mode"=="cors"
) и credentialed ( "credentials"=="include"|"same-origin"
).
Однако обратите внимание, что вышеприведенный трюк не работает правильно для не-XHR / запросов выборки, потому что, например, fetch
и <img>
использовать разные алгоритмы для установления соединения, как объяснено ранее.
Наконец, в HTML <link ...crossorigin>
=== <link ...crossorigin=anonymous>
.
Дополнительные заметки и ссылки: