nginx se a instrução dentro do local retornar 404

11

O bloco a seguir

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

… Causa um 404, pois o código acima nunca atinge a try_filesdiretiva, portanto:

  1. Isso está relacionado ao IfIsEvil do nginx?

  2. Se for, existe alguma outra maneira de testar o http_originnão usando uma instrução if?

Eu tentei isso com nginx> 1.4 (1.4.6, 1.7, 1.7.8).

Spyros Lambrinidis
fonte
1) É exatamente a partir de exemplos "se é mau". 2) Você pode usar mapou usar iffora do local.
Alexey Ten
@AlexeyTen, você poderia fornecer um exemplo de como usar iffora do bloco de localização?
Eliran Malka

Respostas:

19

Eu usaria 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
fonte
E se as origens permitidas precisarem ser diferentes para cada servidor?
Chris Martin
3
Use várias maps com diferentes variáveis
Alexey Ten