Usando nginx try_files e páginas de erro personalizadas para o bloco de localização principal?

1

Ao usar o try_files no nginx, existe uma maneira de especificar e usar uma página de erro customizada somente depois de ter tentado cada URI especificado na diretiva try_files?

A configuração abaixo não funciona:

location / {   
    if (-f $document_root/error_page.html ) {
        error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 495 496 497 500 501 502 503 504 505 506 507 /error_page.html;
    }
    try_files $uri $uri/ @redirect_store;
}

Parece que, se você usar uma diretiva error_page, quando o nginx não puder localizar o URI passado, ele retornará imediatamente a página de erro 404 customizada, em vez de tentar a próxima entrada em try_files. Parece que a diretiva error_page substitui try_files?

Eu só posso fazer isso funcionar quando nenhuma diretiva error_page é especificada:

location / {   
    try_files $uri $uri/ @redirect_store;
}

Mas, no caso acima, se cada entrada for tentada e ainda não for encontrada, ela retornará a página de erro 404 padrão, mas eu quero que ela retorne uma personalizada.

Alguém sabe como conseguir isso ou não é possível? Isso é um bug no nginx? Eu deveria ser capaz de usar um error_page personalizado com try_files assumindo que um URI não foi encontrado em nenhuma das entradas try_files.

Para resumir, try_files não passa pela cadeia de entradas se a diretiva error_page for especificada.

    
por OwN 25.03.2016 / 03:26

1 resposta

1

Existem dois problemas com o que você está tentando fazer:

  • o bloco if não está se comportando como você gostaria
  • é improvável que qualquer resposta 404 seja originada no bloco location /

Este documento explica por que o bloco if só deve ser usado em situações muito específicas.

A ação final do bloco location / é chamar o local nomeado @redirect_store . Se alguma resposta 404 for gerada, é provável que ela ocorra após o processamento ter deixado o bloco location / . Portanto, qualquer diretiva error_page declarada apenas dentro do escopo do bloco location / será ignorada (independentemente dos problemas do bloco if mencionados acima).

A linha final do documento error_page afirma que:

If uri processing leads to an error, the status code of the last occurred error is returned to the client.

O que significa que a sua declaração if de proteção é desnecessária de qualquer maneira.

Tente isso:

error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 495 496 497 500 501 502 503 504 505 506 507 /error_page.html;

location / {   
    try_files $uri $uri/ @redirect_store;
}
    
por 26.03.2016 / 12:37