
error_page のフォールバックを作成しようとしています。基本的に、ロジックは次のようになります。
- foobar.html をロードする
- リモートサーバーに存在しない -> リモートサーバーから 404.html をロードして 404 ページを表示します
- リモートサーバーに存在しない -> ローカルファイルシステムに 404.html をロードする
両方をロードするlocalhost/404.html
とlocalhost/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 が大好きです。