A localização aninhada não funciona corretamente

1

Eu não posso depurar este pedaço de configuração do nginx:
Eu quero adicionar alguns cabeçalhos para todas as solicitações de um arquivo .pdf
Então eu quero remover um token que eu adiciono ao meu diretório veiw para evitar o cache do navegador indesejado:

location /static {
    location ~* \.pdf$ {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }
    #Remove Anti cache token
    rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;
    ...
}

Não há erro de sintaxe nginx, mas a solicitação de um .pdf para mostrar um erro 404 não encontrado significa que a reescrita não se aplica à solicitação.

Qualquer ajuda é muito apreciada
Obrigado

    
por Mahyar Damavand 20.01.2018 / 10:31

2 respostas

3

Quando nginx escolhe um location para processar uma solicitação, ele pode escolher o bloco location interno ou externo. Não combina as declarações de ambos.

O rewrite não é herdado pelo aninhado location . Se você quiser que o rewrite se aplique a todos os locais, coloque-o no escopo do bloco server .

A expressão regular da sua declaração rewrite é suficientemente específica, e pode ser movida como está.

Por exemplo:

rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;

location /static {
    location ~* \.pdf$ {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }
    ...
}

Claro, pode ser mais eficiente apenas repetir a instrução rewrite nos dois blocos location .

Uma abordagem alternativa é evitar o rewrite e usar uma expressão regular location para remover o token de cache, usando uma diretiva alias . Consulte este documento para saber mais.

Por exemplo:

location ~ "^(?<prefix>/static)[0-9]{10}(?<suffix>/.*)$" {
    alias /path/to/root$prefix$suffix;

    location ~* \.pdf$ {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }
    ...
}

Observe que a expressão regular location block tem uma ordem de avaliação diferente para prefixar location blocks. Consulte este documento para obter detalhes.

    
por 20.01.2018 / 11:09
0

Embora a melhor resposta para essa pergunta seja o que eu verifiquei como o melhor, quero postar a solução que usei para resolver o meu problema. Não é necessário definir um bloco de localização aninhado para adicionar um cabeçalho a algumas solicitações. Em vez disso, usei um if para verificar uma condição de regex e fazer o que quero.
Veja o seguinte bloco que escrevi para lidar com isso:

location /static {
    if ( $request_uri ~* \.pdf$ ) {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }

    #Remove Anti cache token
    rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;
    ...
}
    
por 21.01.2018 / 09:15