リモート error_page が見つからない場合にローカル error_page を使用するにはどうすればよいでしょうか?

リモート error_page が見つからない場合にローカル error_page を使用するにはどうすればよいでしょうか?

error_page のフォールバックを作成しようとしています。基本的に、ロジックは次のようになります。

  1. foob​​ar.html をロードする
  2. リモートサーバーに存在しない -> リモートサーバーから 404.html をロードして 404 ページを表示します
  3. リモートサーバーに存在しない -> ローカルファイルシステムに 404.html をロードする

両方をロードするlocalhost/404.htmllocalhost/global404.html動作しますが、中断するとlocalhost/404.html(http サーバーからファイルを削除することによって)、global404.html期待どおりにページが表示されません。

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;
    }
}

上記は、ヒットすると正常に動作しますhttp://localhost/404.html(404.html ファイルがリモート サーバー上にある場合はそれが示され、ファイルを削除すると global404.html ファイルが読み込まれます)。

ただし、存在しないページを入力すると、デフォルトの nginx 404 ページが表示されます。

答え1

質問に残されたコメントの文言のおかげで、recursive_error_pagesカスケード/再帰を許可するオプションを見つけることができましたerror_pages。ドキュメントでそれを見逃していたことを愚かに感じています。

しかし、単に

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;
    }
}

うまくいきました。私は nginx が大好きです。

関連情報