Tutte le risposte finora sembrano semplificate, incomplete o parzialmente errate (l'argomento è complesso, le cose hanno un nome confuso e non sono ben documentate!), Quindi ecco la mia comprensione:
Per poter riutilizzare la connessione creata da <link rel=preconnect>
, le cose dipendono dal tipo di contenuto che si desidera recuperare, da dove, se la richiesta invierà le credenziali del browser (che possono essere stabilite dal browser in modo esplicito o implicito):
La richiesta è della stessa origine ( example.com
richiede risorse secondarie da example.com
)
In preconnect
primo luogo non è necessario affatto; il browser mantiene aperta la connessione dopo aver caricato la pagina per un bel po '. Se ci sono più connessioni da aprire, il browser decide da solo se e quante aprire (a seconda se il server annuncia il supporto HTTP / 2 nell'handshake TLS, nelle impostazioni del browser ecc.)
da verificare : cosa succede se la richiesta della stessa origine ha un crossorigin
attributo: viene utilizzata o ignorata?
La richiesta è di origine incrociata ( example.com
richiede risorse secondarie da another.com
)
- se la richiesta effettiva ha l'
crossorigin
attributo esplicitamente impostato in HTML ( crossOrigin
in JS - il caso è importante), anche la preconnessione deve averlo, con lo stesso valore (forse tranne nei casi in cui non ha senso e crossorigin
viene ignorato - non del tutto chiaro per io ancora)
- altrimenti, se richiesto se per
<script type=module>
: da verificare
- altrimenti, se la richiesta è e richiesta di "vecchia scuola" per
<img>
, <style type=stylesheet>
, <iframe>
, classico <script>
ecc (avviato tramite HTML o JS) , senza crossorigin
esplicitamente specificato , allora il preconnect non deve aver crossorigin
impostato l'attributo.
- altrimenti, se la richiesta è una richiesta di font di origine incrociata , deve essere presente la preconnessione
crossorigin=anonymous
- altrimenti, se la richiesta è di origine incrociata
fetch
o XHR
:
- se viene eseguito in modalità credenziale (ovvero i cookie sono collegati o viene utilizzata l'autenticazione HTTP di base; in caso di recupero, ciò significa
credentials !== omit
; in caso di XHR withCredentials === true
:): preconnect deve averecrossorigin=use-credentials
- se non è in modalità credenziale: deve avere la preconnessione
crossorigin=anonymous
Per l'ultimo caso (fetch / XHR), vai al pannello di rete in Chrome / Firefox devtools, fai clic con il pulsante destro del mouse su una richiesta e scegli copy as fetch
da un menu a discesa. Questo creerà uno snippet di JS, che ti dirà se quella richiesta è CORS-enabled ( "mode"=="cors"
) e credentialed ( "credentials"=="include"|"same-origin"
).
Nota, tuttavia, il trucco di cui sopra non funziona correttamente per le richieste non XHR / fetch, perché ad esempio fetch
e <img>
utilizza algoritmi diversi per stabilire la connessione, come spiegato prima.
Infine, in HTML, <link ...crossorigin>
=== <link ...crossorigin=anonymous>
.
Note e collegamenti aggiuntivi: