ข้อผิดพลาด CORS ในโดเมนเดียวกัน?


87

ตอนนี้ฉันกำลังประสบปัญหา CORS แปลก ๆ

นี่คือข้อความแสดงข้อผิดพลาด:

XMLHttpRequest cannot load http://localhost:8666/routeREST/select?q=[...] 
Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin

เซิร์ฟเวอร์สองเครื่อง:

  • localhost: 8666 / routeREST /: นี่คือเซิร์ฟเวอร์ Python Bottle แบบธรรมดา
  • localhost: 8080 /: Python simpleHTTPserver ที่ฉันเรียกใช้แอปพลิเคชัน Javascript แอปนี้กำลังดำเนินการตามคำขอของ Ajax บนเซิร์ฟเวอร์ด้านบน

มีความคิดเกี่ยวกับสิ่งที่อาจเป็นปัญหาหรือไม่?

แก้ไข:

และ ... พอร์ตคือปัญหา ขอบคุณสำหรับคำตอบ :)

หากใครใช้เซิร์ฟเวอร์ Python bottle เช่นกันคุณสามารถทำตามคำตอบที่ให้ไว้ในโพสต์นี้เพื่อแก้ปัญหา CORS: Bottle Py: การเปิดใช้งาน CORS สำหรับคำขอ jQuery AJAX


10
เนื่องจากอยู่คนละพอร์ตจึงไม่เหมือนกัน!
บาง

หมายเลขพอร์ตแตกต่างกัน ซึ่งอาจละเมิดกฎ Cross Origin

4
โปรดทราบว่า IE ไม่ได้คำนึงถึงหมายเลขพอร์ต
Ray Nicholus

@some เบราว์เซอร์ส่วนใหญ่ยังสรุปว่าไม่เหมือนกันหากมี 'www' และอีกอันไม่มี ปีศาจในรายละเอียด
ไม่ค่อยต้องการ 'Where's Monica'

@SeldomNeedy example.com, www.example.com, www1.example.com และ mirror.www.example.com ล้วนเป็นโดเมนที่แตกต่างกัน example.com , example.com , example.com , example.com:80443ล้วนมาจากต้นกำเนิดที่แตกต่างกัน
บาง

คำตอบ:


124

ก็ถือว่าเท่านั้นที่จะเป็นแบบเดียวกันถ้าโปรโตคอล , โฮสต์ และ พอร์ตจะเหมือนกัน: เดียวกันนโยบายแหล่งกำเนิดสินค้า

หากคุณต้องการเปิดใช้งานคุณต้องทำตามCross-Origin Resource Sharing (cors)โดยการเพิ่มส่วนหัว Mozilla มีตัวอย่าง

คุณต้องเพิ่ม Access-Control-Allow-Origin เป็นส่วนหัวในการตอบกลับของคุณ เพื่อให้ทุกคน (คุณอาจจะไม่ทำอย่างนั้น):

Access-Control-Allow-Origin: *

หากคุณต้องการสนับสนุนแหล่งที่มาหลายรายการ (เช่นทั้งคู่example.comและwww.example.com) ให้ตั้งค่าAccess-Control-Allow-Originในการตอบกลับของคุณเป็นค่าของOrigin-header จากคำขอ (หลังจากที่คุณตรวจสอบแล้วว่า Origin นั้นอยู่ในรายการสีขาว)

นอกจากนี้โปรดทราบว่าคำขอบางรายการจะส่งคำขอไฟล่วงหน้าโดยมีวิธีการ OPTION ดังนั้นหากคุณเขียนรหัสของคุณเองคุณจะต้องจัดการคำขอเหล่านั้นด้วย ดู Mozilla สำหรับตัวอย่าง


8
ควรเน้นด้วยสีแดงตัวพิมพ์ใหญ่และตัวหนาทุกที่ที่ AJAX เข้ามาเกี่ยวข้อง
Zoltán Schmidt

5
ในฐานะที่เป็นภาคผนวกของคำตอบนี้ทราบว่า'Access-Control-Allow-Origin: https://example.com'เป็นไม่'Access-Control-Allow-Origin: https://www.example.com'เทียบเท่ากับ หากไซต์ของคุณสามารถเข้าถึงได้จากทั้งสองไซต์คุณควรมีทั้งสองอย่างในส่วนหัวการตอบกลับ
ไม่ค่อยต้องการ 'Where's Monica'

1
ทราบว่าไม่มีการร้องขอ preflight จะถูกส่งโดยค่าเริ่มต้นสำหรับการร้องของ่ายๆเช่นGET, และPOST HEADดูบทความ MDN ที่เชื่อมโยงในคำตอบสำหรับรายละเอียดเพิ่มเติม
Emile Bergeron

@SeldomNeedy คุณไม่สามารถมีส่วนหัวที่ซ้ำกันได้
Mike Flynn

@MikeFlynn ข้อความของฉันเป็นที่ยอมรับว่าสัมผัสหลวม ๆ แต่ฉันไม่ได้พยายามที่จะแนะนำอย่างนั้น เซิร์ฟเวอร์เพียงแค่ต้องได้รับการกำหนดค่าเพื่อส่งส่วนหัวที่เหมาะสมตามคำขอ
ไม่ค่อยต้องการ 'Where's Monica'

30

หมายเลขพอร์ตแตกต่างกัน

คำขอถือเป็นการข้ามโดเมนหากรูปแบบชื่อโฮสต์หรือพอร์ตใด ๆ ไม่ตรงกัน


1
ยกเว้น 443 และ 80
Joseph Lust

17
รวม 443 และ 80
code_monk

5
การยืนยันปัญหาจะเป็นทางออกของปัญหาได้อย่างไร? โพสต์คำตอบเพื่อน
พิธี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.