Semua jawaban sejauh ini tampaknya disederhanakan, tidak lengkap atau sebagian salah (topiknya kompleks, semuanya membingungkan dan tidak didokumentasikan dengan baik!), Jadi inilah pemahaman saya:
Untuk dapat menggunakan kembali koneksi yang dibuat oleh <link rel=preconnect>
, hal-hal tergantung pada jenis konten yang ingin Anda ambil, dari mana, apakah permintaan akan mengirim kredensial browser (yang dapat dibuat oleh browser secara eksplisit atau implisit):
Permintaan sama-asal ( example.com
permintaan sub-sumber dari example.com
)
preconnect
Pertama-tama tidak perlu sama sekali; browser membuat koneksi tetap terbuka setelah memuat halaman cukup lama. Jika ada beberapa koneksi yang akan dibuka, browser memutuskan sendiri apakah dan berapa banyak yang akan dibuka (tergantung apakah server mengumumkan dukungan HTTP / 2 dalam jabat tangan TLS, pengaturan browser, dll.)
untuk diperiksa : bagaimana jika permintaan asal-sama memiliki crossorigin
atribut: apakah itu digunakan atau diabaikan?
Permintaan berasal dari silang ( example.com
meminta sumber daya dari another.com
)
- jika permintaan aktual memiliki
crossorigin
atribut yang secara eksplisit diatur dalam HTML ( crossOrigin
dalam JS - case penting), preconnect juga harus memilikinya, dengan nilai yang sama (mungkin kecuali dalam kasus di mana itu tidak masuk akal dan crossorigin
diabaikan - tidak sepenuhnya jelas untuk saya belum)
- lain, jika meminta jika
<script type=module>
: diperiksa
- lain, jika permintaan itu dan "sekolah tua" permintaan
<img>
, <style type=stylesheet>
, <iframe>
, klasik <script>
dll (dimulai melalui HTML atau JS) tanpa crossorigin
secara eksplisit ditentukan , maka preconnect yang HARUS TIDAK memiliki crossorigin
atribut set.
- selain itu, jika permintaan adalah permintaan font lintas-asal , preconnect harus dimiliki
crossorigin=anonymous
- selain itu, jika permintaan adalah lintas asal
fetch
atau XHR
:
- jika dilakukan dalam mode kredensial (yaitu cookie dilampirkan atau HTTP auth dasar digunakan; dalam kasus pengambilan, ini berarti
credentials !== omit
; dalam kasus XHR withCredentials === true
:): preconnect harus memilikicrossorigin=use-credentials
- jika tidak dalam mode kredensial: pra-koneksi harus ada
crossorigin=anonymous
Untuk kasus terakhir (ambil / XHR), buka panel jaringan di Chrome / Firefox devtools, klik kanan permintaan, dan pilih copy as fetch
dari dropdown. Ini akan membuat potongan JS, yang akan memberi tahu Anda jika permintaan itu diaktifkan CORS ( "mode"=="cors"
) dan kredensial ( "credentials"=="include"|"same-origin"
).
Namun, perhatikan trik di atas tidak berfungsi dengan benar untuk permintaan non-XHR / fetch, karena misalnya fetch
dan <img>
menggunakan algoritma yang berbeda untuk membuat koneksi, seperti yang dijelaskan sebelumnya.
Akhirnya, dalam HTML, <link ...crossorigin>
=== <link ...crossorigin=anonymous>
.
Catatan dan tautan tambahan: