nginx if instrukcja wewnątrz położenia zwraca 404

11

Następujący blok

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

… Powoduje błąd 404, ponieważ powyższy kod nigdy nie osiąga try_filesdyrektywy, więc:

  1. Czy ma to związek z IfIsEvil z Nginx?

  2. Jeśli tak, to czy jest jakiś inny sposób na przetestowanie http_origin, nie używając instrukcji if?

Próbowałem tego z nginx> 1.4 (1.4.6, 1.7, 1.7.8).

Spyros Lambrinidis
źródło
1) To dokładnie z przykładów „jeśli to zło”. 2) Możesz użyć maplub użyć ifpoza lokalizacją.
Alexey Ten
@AlexeyTen, czy możesz podać przykład, jak korzystać ifpoza blokiem lokalizacji?
Eliran Malka

Odpowiedzi:

19

Użyłbym 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
źródło
Co jeśli dozwolone źródła muszą być różne dla każdego serwera?
Chris Martin,
3
Użyj kilku maps z różnymi zmiennymi
Alexey Ten