Como usar o error_page local quando o error_page remoto não foi encontrado?

Como usar o error_page local quando o error_page remoto não foi encontrado?

Estou tentando criar um substituto para minha página de erro. Basicamente, a lógica deve ser algo como o seguinte:

  1. carregar foobar.html
  2. não existe no servidor remoto -> carregue 404.html do servidor remoto para mostrar a página 404
  3. não existe no servidor remoto -> carrega 404.html no sistema de arquivos local

Carregar ambos localhost/404.htmlfunciona localhost/global404.html, mas quando eu quebro localhost/404.html(removendo o arquivo do servidor http) ele não mostra a global404.htmlpá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_pagesopçã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.

informação relacionada