การอนุญาตการร้องขอ cross origin (CORS) บน Nginx สำหรับการตอบกลับ 404


26

ฉันใช้ Nginx เพื่อให้บริการไฟล์คงที่เพื่อตอบสนองคำขอ CORS โดยใช้เทคนิคที่ระบุไว้ในคำถามนี้ อย่างไรก็ตามเมื่อไฟล์ไม่มีการตอบสนอง 404 นั้นไม่มีAccess-Control-Allow-Origin: *ส่วนหัวดังนั้นเบราว์เซอร์จึงถูกบล็อก

ฉันจะส่งAccess-Control-Allow-Origin: *การตอบกลับ 404 ครั้งได้อย่างไร

คำตอบ:


35

แม้ว่าจะถูกถามมานานแล้ว แต่ฉันก็รวบรวม nginx พร้อมโมดูลมากขึ้น แต่ด้วย nginx รุ่นใหม่กว่าฉันพบว่าฉันไม่จำเป็นต้องคอมไพล์ nginx ที่กำหนดเองทั้งหมดที่ฉันต้องการคือการเพิ่มalwaysคำสั่ง

http://nginx.org/en/docs/http/ngx_http_headers_module.html

Syntax: add_header name value [always];

หากระบุพารามิเตอร์ always (1.7.5) ฟิลด์ส่วนหัวจะถูกเพิ่มโดยไม่คำนึงถึงรหัสการตอบกลับ

ดังนั้นส่วนหัวCORSเวอร์ชันที่ปรับแล้ว:

            if ($cors = "trueget") {
                    # Tells the browser this origin may make cross-origin requests
                    # (Here, we echo the requesting origin, which matched the whitelist.)
                    add_header 'Access-Control-Allow-Origin' "$http_origin" always;

                    # Tells the browser it may show the response, when XmlHttpRequest.withCredentials=true.
                    add_header 'Access-Control-Allow-Credentials' 'true' always;
            }

2
alwaysเป็นกุญแจสำคัญ ขอบคุณสำหรับการชี้ให้ฉันออกไปฉันจะโกรธ!
bgondy

11

ฉันสมมติว่าคุณกำลังใช้add_headerคำสั่ง เอกสารประกอบระบุว่าจะตั้งค่าส่วนหัวสำหรับรหัสสถานะ 200, 204, 301, 302 และ 304 เท่านั้น ในการตั้งค่าส่วนหัวสำหรับรหัสสถานะ 404 คุณจะต้องใช้more_set_headersคำสั่งจากโมดูลheaders_more (คุณอาจต้องคอมไพล์ nginx เพื่อรับโมดูลนี้) ต่อไปนี้จะตั้งค่าส่วนหัวสำหรับรหัสสถานะทั้งหมด:

more_set_headers 'Access-Control-Allow-Origin: *';

นอกจากนี้คุณยังสามารถ จำกัด รหัสได้เฉพาะรหัสสถานะ:

more_set_headers -s '404' 'Access-Control-Allow-Origin: *';
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.