nginx ถ้าคำสั่งภายในตำแหน่งส่งคืน 404


11

บล็อกดังต่อไปนี้

location / {
    if ($http_origin ~* (https?://[^/]*\.example\.com(:[0-9]+)?)) {
        add_header 'Access-Control-Allow-Origin' "$http_origin";
    }
    try_files $uri $uri/ /index.php?$args;
}

... ทำให้ 404 เป็นรหัสข้างต้นไม่ถึงtry_filesคำสั่งดังนั้น:

  1. สิ่งนี้เกี่ยวข้องกับIfIsEvilของ nginx หรือไม่

  2. ถ้าเป็นเช่นนั้นมีวิธีอื่นในการทดสอบhttp_originโดยไม่ใช้คำสั่ง if หรือไม่

ฉันลองสิ่งนี้ด้วย nginx> 1.4 (1.4.6, 1.7, 1.7.8)


1) มันมาจากตัวอย่าง "if is evil" 2) คุณสามารถใช้mapหรือใช้ifนอกสถานที่
Alexey Ten

@AlexeyTen คุณสามารถให้ตัวอย่างสำหรับวิธีการใช้ifนอกบล็อกสถานที่ได้หรือไม่
Eliran Malka

คำตอบ:


19

ฉันจะใช้map:

map $http_origin $cors_header {
    default "";
    "~^https?://[^/]+\.example\.com(:[0-9]+)?$" "$http_origin";
}

server {
    ...
    location / {
        add_header Access-Control-Allow-Origin $cors_header;
        try_files $uri $uri/ /index.php;
    }
    ...
 }

เกิดอะไรขึ้นถ้าต้นกำเนิดที่ได้รับอนุญาตต้องแตกต่างกันไปในแต่ละเซิร์ฟเวอร์
Chris Martin

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