
Estou tentando criar um substituto para minha página de erro. Basicamente, a lógica deve ser algo como o seguinte:
- carregar foobar.html
- não existe no servidor remoto -> carregue 404.html do servidor remoto para mostrar a página 404
- não existe no servidor remoto -> carrega 404.html no sistema de arquivos local
Carregar ambos localhost/404.html
funciona localhost/global404.html
, mas quando eu quebro localhost/404.html
(removendo o arquivo do servidor http) ele não mostra a global404.html
página como eu esperava.
server {
listen 80;
server_name example.com www.example.com;
proxy_intercept_errors on;
location / {
proxy_pass http://localhost:3000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
error_page 404 /404.html;
}
location /404.html {
proxy_pass http://localhost:3000/404.html;
error_page 404 /global404.html;
}
location /global404.html {
root /usr/share/nginx/html;
}
}
O acima funciona bem quando eu bato http://localhost/404.html
(quando o arquivo 404.html está no servidor remoto mostra que, quando eu excluo o arquivo ele carrega o arquivo global404.html).
No entanto, quando digito uma página inexistente, recebo apenas a página nginx 404 padrão.
Responder1
Graças ao texto de um comentário deixado sobre a questão, consegui encontrar a recursive_error_pages
opção que permite cascading/recursive error_pages
. Eu me sinto estúpido por perder isso na documentação.
Mas, simplesmente fazendo
server {
listen 80;
server_name example.com www.example.com;
proxy_intercept_errors on;
recursive_error_pages on;
location / {
proxy_pass http://localhost:3000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
error_page 404 /404.html;
}
location /404.html {
proxy_pass http://localhost:3000/404.html;
error_page 404 /global404.html;
}
location /global404.html {
root /usr/share/nginx/html;
}
}
funcionou um charme. Eu amo o nginx.