¿Cómo utilizar la página de error local cuando no se encuentra la página de error remota?

¿Cómo utilizar la página de error local cuando no se encuentra la página de error remota?

Estoy intentando crear una alternativa para mi página de error. Básicamente, la lógica debería ser algo como lo siguiente:

  1. cargar foobar.html
  2. no existe en el servidor remoto -> cargue 404.html desde el servidor remoto para mostrar la página 404
  3. no existe en el servidor remoto -> cargar 404.html en el sistema de archivos local

Cargando ambos localhost/404.htmly localhost/global404.htmlfunciona, pero cuando lo interrumpo localhost/404.html(al eliminar el archivo del servidor http) no muestra la global404.htmlpá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_pagesopció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.

información relacionada