
Estoy intentando crear una alternativa para mi página de error. Básicamente, la lógica debería ser algo como lo siguiente:
- cargar foobar.html
- no existe en el servidor remoto -> cargue 404.html desde el servidor remoto para mostrar la página 404
- no existe en el servidor remoto -> cargar 404.html en el sistema de archivos local
Cargando ambos localhost/404.html
y localhost/global404.html
funciona, pero cuando lo interrumpo localhost/404.html
(al eliminar el archivo del servidor http) no muestra la global404.html
página como esperaba.
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;
}
}
Lo anterior funciona bien cuando presiono http://localhost/404.html
(cuando el archivo 404.html está en el servidor remoto, muestra que, cuando elimino el archivo, carga el archivo global404.html).
Sin embargo, cuando escribo una página que no existe, aparece la página nginx 404 predeterminada.
Respuesta1
Gracias a la redacción de un comentario dejado sobre la pregunta, logré encontrar la recursive_error_pages
opción que permite el uso en cascada/recursivo error_pages
. Me siento estúpido por faltarlo en la documentación.
Pero simplemente haciendo
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;
}
}
funcionó de maravilla. Me encanta nginx.