คำตอบทั้งหมดดูเหมือนจะง่ายไม่สมบูรณ์หรือไม่ถูกต้องบางส่วน (หัวข้อมีความซับซ้อนสิ่งต่าง ๆ ถูกตั้งชื่อสับสนและไม่ได้รับการบันทึกไว้!) ดังนั้นนี่คือความเข้าใจของฉัน:
เพื่อให้สามารถใช้การเชื่อมต่อที่สร้างขึ้น<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>
บันทึกและลิงก์เพิ่มเติม: