web-dev-qa-db-ja.com

リモートerror_pageが見つからないときにローカルerror_pageを使用する方法

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

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

localhost/404.htmllocalhost/global404.htmlの両方をロードしても機能しますが、(httpサーバーからファイルを削除して)localhost/404.htmlを壊すと、期待どおりに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ページが表示されます。

2
Prisoner

質問に残されたコメントの文言のおかげで、カスケード/再帰的な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が大好きです。

1
Prisoner