nginx if-Anweisung innerhalb des Speicherorts gibt 404 zurück

11

Der folgende Block

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

… Verursacht einen 404, da der obige Code niemals die try_filesDirektive erreicht, also:

  1. Hat dies etwas mit dem IfIsEvil von Nginx zu tun ?

  2. Wenn ja, gibt es dann eine andere Möglichkeit, dies zu testen, http_originindem Sie keine if-Anweisung verwenden?

Ich habe dies mit nginx> 1.4 (1.4.6, 1.7, 1.7.8) versucht.

Spyros Lambrinidis
quelle
1) Es ist genau aus "wenn es böse ist" Beispiele. 2) Sie können außerhalb des Standorts verwenden mapoder verwenden if.
Alexey Ten
@AlexeyTen, können Sie ein Beispiel für die Verwendung ifaußerhalb des Standortblocks angeben ?
Eliran Malka

Antworten:

19

Ich würde verwenden 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
quelle
Was ist, wenn die zulässigen Ursprünge für jeden Server unterschiedlich sein müssen?
Chris Martin
3
Verwenden Sie mehrere maps mit unterschiedlichen Variablen
Alexey Ten