Wszystkie dotychczasowe odpowiedzi wydają się uproszczone, niekompletne lub częściowo błędne (temat jest złożony, rzeczy są myląco nazwane i niezbyt dobrze udokumentowane!), Oto moje rozumienie:
Aby móc ponownie użyć połączenia utworzonego przez <link rel=preconnect>
, wszystko zależy od tego, jaki rodzaj treści chcesz pobrać, skąd, czy żądanie wyśle dane uwierzytelniające przeglądarki (które mogą być ustanowione przez przeglądarkę jawnie lub niejawnie):
Żądanie ma to samo pochodzenie ( example.com
żądania z pod -źródłaexample.com
)
Po pierwsze, wcale nie ma takiej potrzeby preconnect
; przeglądarka utrzymuje połączenie otwarte po ładowaniu strony przez dłuższy czas. Jeśli istnieje wiele połączeń do otwarcia, przeglądarka sama decyduje, czy i ile otworzyć (w zależności od tego, czy serwer ogłasza obsługę HTTP / 2 w uzgadnianiu TLS, ustawieniach przeglądarki itp.)
do sprawdzenia : co jeśli crossorigin
atrybut tego samego pochodzenia ma atrybut: czy jest używany czy ignorowany?
Żądanie pochodzi z różnych źródeł ( example.com
żądania z pod -źródłaanother.com
)
- jeśli rzeczywiste żądanie ma jawnie ustawiony
crossorigin
atrybut w HTML ( w JS - ważna jest wielkość liter), musi też mieć to połączenie wstępne o tej samej wartości (być może z wyjątkiem przypadków, w których nie ma to sensu i jest ignorowane - nie do końca jasne ja jeszcze)crossOrigin
crossorigin
- w przeciwnym razie, jeśli wniosek, jeśli
<script type=module>
: do sprawdzenia
- indziej, jeśli wniosek jest i „starej szkoły” zapytanie
<img>
, <style type=stylesheet>
, <iframe>
, klasyczne <script>
itp (inicjowane poprzez HTML lub JS) bez crossorigin
wyraźnie określonej , wówczas wstępne łączenie nie może mieć crossorigin
zestaw atrybutów.
- w przeciwnym razie, jeśli żądanie jest żądaniem czcionki pochodzącej z innego źródła , połączenie wstępne musi mieć
crossorigin=anonymous
- w przeciwnym razie, jeśli wniosek jest źródłem krzyżowym
fetch
lub XHR
:
- jeśli odbywa się to w trybie uwierzytelnienia (tzn. pliki cookie są dołączone lub używane jest podstawowe uwierzytelnianie HTTP; w przypadku pobierania oznacza to
credentials !== omit
; w przypadku XHR withCredentials === true
:): połączenie wstępne musi miećcrossorigin=use-credentials
- jeśli nie jest w trybie uwierzytelnienia: połączenie wstępne musi mieć
crossorigin=anonymous
W ostatnim przypadku (fetch / XHR) przejdź do panelu sieciowego w devtools Chrome / Firefox, kliknij prawym przyciskiem myszy żądanie i wybierz copy as fetch
z menu rozwijanego. Spowoduje to utworzenie fragmentu kodu JS, który poinformuje Cię, czy to żądanie obsługuje CORS ( "mode"=="cors"
) i jest poświadczone ( "credentials"=="include"|"same-origin"
).
Uwaga jednak podstęp powyżej nie działa poprawnie dla non-XHR / pobrać wnioski, bo na przykład fetch
i <img>
używać różnych algorytmów do ustanowienia połączenia, jak wyjaśniono wcześniej.
Wreszcie w HTML <link ...crossorigin>
=== <link ...crossorigin=anonymous>
.
Dodatkowe uwagi i linki: