Усі відповіді поки що здаються або спрощеними, неповними або частково неправильними (тема складна, речі названі в оманах і недостатньо задокументовані!), Тож ось моє розуміння:
Щоб мати можливість повторно використовувати з'єднання, створене компанією <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 приєднуються або використовується основний auth HTTP; у випадку вилучення це означає
credentials !== omit
; у випадку XHR withCredentials === true
:): попереднє з'єднання повинно матиcrossorigin=use-credentials
- якщо він не перебуває в обліковому режимі: попереднє підключення повинно мати
crossorigin=anonymous
Для останнього випадку (fetch / XHR) перейдіть до мережевої панелі в розробниках Chrome / Firefox, клацніть правою кнопкою миші запит і виберіть copy as fetch
зі спадного меню. Це створить фрагмент JS, який підкаже вам, чи цей запит увімкнено CORS ( "mode"=="cors"
) та підтверджено ( "credentials"=="include"|"same-origin"
).
Зверніть увагу , однак трюк вище не працює для не-XHR / вибірок запитів, тому що, наприклад , fetch
і <img>
використовують різні алгоритми для встановлення з'єднання, як описано раніше.
Нарешті, в HTML, <link ...crossorigin>
=== <link ...crossorigin=anonymous>
.
Додаткові примітки та посилання: