nginx jika pernyataan di dalam lokasi mengembalikan 404

11

Blok berikut

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

... menyebabkan 404 karena kode di atas tidak pernah mencapai try_filesarahan, jadi:

  1. Apakah ini terkait dengan IfIsEvil dari nginx?

  2. Jika ya, apakah ada cara lain untuk menguji http_origindengan tidak menggunakan pernyataan if?

Saya sudah mencoba ini dengan nginx> 1.4 (1.4.6, 1.7, 1.7.8).

Spyros Lambrinidis
sumber
1) Ini persis dari contoh "jika itu jahat". 2) Anda dapat menggunakan mapatau menggunakan di ifluar lokasi.
Alexey Ten
@AlexeyTen, dapatkah Anda memberikan contoh cara menggunakan di ifluar blok lokasi?
Eliran Malka

Jawaban:

19

Saya akan menggunakan 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;
    }
    ...
 }
Alexey Ten
sumber
Bagaimana jika asal yang diizinkan harus berbeda untuk setiap server?
Chris Martin
3
Gunakan beberapa maps dengan variabel yang berbeda
Alexey Ten