คุณจะไม่สามารถโทรหา ajax http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
จากไฟล์ที่ใช้งานได้ในเวลาhttp://run.jsbin.com
อันเนื่องมาจากนโยบายที่มาเดียวกัน
ในฐานะที่เป็นแหล่งที่มา (aka กำเนิด ) และหน้าเป้าหมาย URL ที่อยู่ในโดเมนที่แตกต่างกัน ( run.jsbin.com
และwww.ecb.europa.eu
) รหัสของคุณเป็นจริงความพยายามที่จะทำให้การข้ามโดเมน ( ธ )GET
ขอไม่ธรรมดา
ในคำไม่กี่คำนโยบายที่มาเดียวกันกล่าวว่าเบราว์เซอร์ควรอนุญาตให้ ajax โทรไปยังบริการที่โดเมนเดียวกันของหน้า HTML
ตัวอย่าง:
หน้าที่http://www.example.com/myPage.html
สามารถโดยตรงขอรับบริการที่มีอย่างเช่นhttp://www.example.com
http://www.example.com/api/myService
หากบริการโฮสต์อยู่ที่โดเมนอื่น (พูดhttp://www.ok.com/api/myService
) เบราว์เซอร์จะไม่โทรออกโดยตรง (ตามที่คุณคาดหวัง) แต่จะพยายามส่งคำขอ CORS แทน
ในการดำเนินการในไม่ช้าเพื่อดำเนินการตามคำขอ (CORS) * ในโดเมนต่างๆเบราว์เซอร์ของคุณ:
- จะรวม
Origin
ส่วนหัวในคำขอเดิม (โดยมีโดเมนของเพจเป็นค่า) และดำเนินการตามปกติ แล้ว
- เฉพาะในกรณีที่การตอบสนองของเซิร์ฟเวอร์ต่อคำขอนั้นมีส่วนหัวที่เพียงพอ (
Access-Control-Allow-Origin
เป็นหนึ่งในนั้น ) ที่อนุญาตให้มีการร้องขอ CORS การเรียกดูจะดำเนินการเรียกให้เสร็จสมบูรณ์ (เกือบจะ ** เหมือนกับที่หน้า HTML อยู่ในโดเมนเดียวกัน)
- หากส่วนหัวที่คาดไว้ไม่มาเบราว์เซอร์ก็ยอมแพ้ (เช่นเดียวกับคุณ)
* ด้านบนแสดงให้เห็นขั้นตอนในคำของ่ายๆเช่นปกติที่GET
ไม่มีส่วนหัวแฟนซี หากคำขอไม่ง่าย (เช่นประเภทเนื้อหาPOST
with application/json
as) เบราว์เซอร์จะพักไว้สักครู่และก่อนที่จะดำเนินการOPTIONS
ตามคำขอจะส่งคำขอไปยัง URL เป้าหมายก่อน เช่นเดียวกับข้างต้นจะดำเนินการต่อเมื่อการตอบสนองต่อOPTIONS
คำขอนี้มีส่วนหัว CORS นี้OPTIONS
โทรเป็นที่รู้จักกันpreflightคำขอ
** ฉันพูดว่าเกือบจะเป็นเพราะมีความแตกต่างอื่น ๆ ระหว่างการโทรปกติและการโทร CORS สิ่งที่สำคัญคือบางส่วนหัวแม้ว่าจะมีอยู่ในการตอบกลับ แต่เบราว์เซอร์Access-Control-Expose-Headers
จะไม่หยิบขึ้นมาหากไม่รวมอยู่ในส่วนหัว
ต้องแก้ไขอย่างไร?
มันเป็นเพียงการพิมพ์ผิด? บางครั้งโค้ด JavaScript มีเพียงการพิมพ์ผิดในโดเมนเป้าหมาย คุณตรวจสอบแล้วหรือยัง? ถ้าหน้าwww.example.com
มันจะโทรไปหาปกติเท่านั้นwww.example.com
! URL อื่น ๆ เช่นapi.example.com
หรือแม้กระทั่งexample.com
หรือwww.example.com:8080
ถือว่าเป็นโดเมนที่แตกต่างกันโดยเบราว์เซอร์! ใช่ถ้าพอร์ตแตกต่างกันแสดงว่าเป็นโดเมนอื่น!
เพิ่มส่วนหัว วิธีที่ง่ายที่สุดในการเปิดใช้งาน CORS คือการเพิ่มส่วนหัวที่จำเป็น (เป็นAccess-Control-Allow-Origin
) ให้กับการตอบสนองของเซิร์ฟเวอร์ (แต่ละเซิร์ฟเวอร์ / ภาษามีวิธีการทำเช่นนั้น - ตรวจสอบวิธีแก้ปัญหาบางอย่างที่นี่ )
ทางเลือกสุดท้าย:หากคุณไม่มีสิทธิ์เข้าถึงบริการจากฝั่งเซิร์ฟเวอร์คุณยังสามารถมิเรอร์ได้ (ผ่านเครื่องมือเช่นพร็อกซีย้อนกลับ ) และรวมส่วนหัวที่จำเป็นทั้งหมดไว้ที่นั่น