nginx si la declaración dentro de la ubicación devuelve 404

11

El siguiente bloque

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

... provoca un 404 ya que el código anterior nunca llega a la try_filesdirectiva, por lo tanto:

  1. ¿Está relacionado con el IfIsEvil de nginx?

  2. Si es así, ¿hay alguna otra forma de probarlo al http_originno usar una instrucción if?

He intentado esto con nginx> 1.4 (1.4.6, 1.7, 1.7.8).

Spyros Lambrinidis
fuente
1) Es exactamente de ejemplos de "si es malo". 2) Puede usar mapo usar iffuera de la ubicación.
Alexey Ten
@AlexeyTen, ¿podría proporcionar un ejemplo de cómo usarlo iffuera del bloque de ubicación?
Eliran Malka

Respuestas:

19

Yo usaría 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
fuente
¿Qué sucede si los orígenes permitidos deben ser diferentes para cada servidor?
Chris Martin
3
Use varios maps con diferentes variables
Alexey Ten,