คำตอบทั้งหมดดูเหมือนจะง่ายไม่สมบูรณ์หรือไม่ถูกต้องบางส่วน (หัวข้อมีความซับซ้อนสิ่งต่าง ๆ ถูกตั้งชื่อสับสนและไม่ได้รับการบันทึกไว้!) ดังนั้นนี่คือความเข้าใจของฉัน:
เพื่อให้สามารถใช้การเชื่อมต่อที่สร้างขึ้น<link rel=preconnect>ใหม่ได้สิ่งต่างๆขึ้นอยู่กับประเภทของเนื้อหาที่คุณต้องการดึงข้อมูลจากที่ใดว่าคำขอจะส่งข้อมูลรับรองเบราว์เซอร์หรือไม่
การร้องขอมาจากแหล่งกำเนิดเดียวกัน ( example.comร้องขอ subresource จากexample.com)
ไม่จำเป็นต้องมีpreconnectตั้งแต่แรก; เบราว์เซอร์จะคงการเชื่อมต่อไว้หลังจากที่โหลดหน้าเว็บมาระยะหนึ่งแล้ว หากมีหลายการเชื่อมต่อที่จะเปิดเบราว์เซอร์จะตัดสินใจด้วยตัวเองว่าจะเปิดกี่ครั้ง (ขึ้นอยู่กับว่าเซิร์ฟเวอร์ประกาศการสนับสนุน HTTP / 2 ในการจับมือ TLS การตั้งค่าเบราว์เซอร์ ฯลฯ )
ที่จะตรวจสอบ : จะเกิดอะไรขึ้นถ้าคำขอที่มาเดียวกันมีcrossoriginแอตทริบิวต์: มันถูกใช้หรือเพิกเฉย?
คำขอเป็นcross-origin ( example.comร้องขอ subresource จากanother.com)
- หากคำขอจริงมีการตั้งค่า
crossoriginแอตทริบิวต์อย่างชัดเจนใน HTML ( crossOriginใน JS - กรณีเป็นสิ่งสำคัญ) การเชื่อมต่อล่วงหน้าจะต้องมีค่าเดียวกัน(อาจยกเว้นในกรณีที่ไม่เหมาะสมและcrossoriginไม่สนใจ - ไม่ชัดเจนสำหรับ ฉันยัง)
- มิฉะนั้นถ้ามีการร้องขอถ้าสำหรับ
<script type=module>: ที่จะตรวจสอบ
- อื่นถ้าขอและโรงเรียนเก่า "" ขอให้
<img>, <style type=stylesheet>, <iframe>คลาสสิก<script>ฯลฯ (ริเริ่มผ่าน HTML หรือ JS) โดยไม่ต้องcrossoriginระบุไว้อย่างชัดเจนแล้วต้อง preconnect ได้มีcrossoriginชุดแอตทริบิวต์
- มิฉะนั้นหากคำขอเป็นคำขอแบบอักษรข้ามแหล่งข้อมูลจะต้องมีการเชื่อมต่อล่วงหน้า
crossorigin=anonymous
- มิฉะนั้นถ้าคำขอเป็นcross-origin
fetchหรือXHR:
- หากทำในโหมดหนังสือรับรอง (เช่นมีการแนบคุกกี้หรือใช้การรับรองความถูกต้องพื้นฐาน HTTP ในกรณีของการดึงข้อมูลหมายถึงนี้
credentials !== omitในกรณีของ XHR:) withCredentials === true: การเชื่อมต่อล่วงหน้าจะต้องมีcrossorigin=use-credentials
- หากไม่ได้อยู่ในโหมดหนังสือรับรอง: ต้องมีการเชื่อมต่อล่วงหน้า
crossorigin=anonymous
สำหรับกรณีสุดท้าย (fetch / XHR) ไปที่แผงเครือข่ายใน Chrome / Firefox devtools คลิกขวาที่คำขอและเลือกcopy as fetchจากรายการแบบเลื่อนลง สิ่งนี้จะสร้างตัวอย่างของ JS ซึ่งจะบอกคุณว่าคำขอนั้นเปิดใช้งาน CORS ( "mode"=="cors") และรับรอง ( "credentials"=="include"|"same-origin") หรือไม่
โปรดทราบว่าเทคนิคดังกล่าวไม่สามารถทำงานได้อย่างถูกต้องสำหรับคำขอที่ไม่ใช่ XHR / การดึงข้อมูลเนื่องจากตัวอย่างfetchและ<img>ใช้อัลกอริทึมที่แตกต่างเพื่อสร้างการเชื่อมต่อดังที่อธิบายไว้ก่อนหน้านี้
สุดท้ายใน HTML, ===<link ...crossorigin><link ...crossorigin=anonymous>
บันทึกและลิงก์เพิ่มเติม: