nginx nếu câu lệnh bên trong vị trí trả về 404


11

Khối sau

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

Càng gây ra một 404 vì mã trên không bao giờ đạt được try_fileschỉ thị, vì vậy:

  1. Điều này có liên quan đến IfIsEvil của nginx không?

  2. Nếu có, thì có cách nào khác để kiểm tra http_originbằng cách không sử dụng câu lệnh if không?

Tôi đã thử điều này với nginx> 1.4 (1.4.6, 1.7, 1.7.8).


1) Đó chính xác là từ các ví dụ "nếu là xấu xa". 2) Bạn có thể sử dụng maphoặc sử dụng ifbên ngoài vị trí.
Alexey Ten

@AlexeyTen, bạn có thể cung cấp một ví dụ về cách sử dụng ifbên ngoài khối vị trí không?
Eliran Malka

Câu trả lời:


19

Tôi sẽ sử dụng 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;
    }
    ...
 }

Điều gì xảy ra nếu nguồn gốc được phép cần phải khác nhau cho mỗi máy chủ?
Chris Martin

3
Sử dụng một vài maps với các biến khác nhau
Alexey Ten
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.