nginx はドキュメントルートのサブディレクトリに error_page を提供しません

nginx はドキュメントルートのサブディレクトリに error_page を提供しません

以下は私の nginx 設定の一部です:

server {
    error_page 500 /errors/500.html;
}

アプリケーションで 500 が発生すると、Chrome ではカスタム エラー ページではなく、デフォルトの 500 ページが表示されます (Firefox と Safari では空白ページが表示されます)。

ファイルが存在することはhttp://server/errors/500.html、ページにアクセスして確認できるのでわかります。また、ファイルをドキュメント ルートに移動し、構成を次のように変更することもできます。

server {
    error_page 500 /500.html;
}

nginx はページを正しく提供しているので、サーバー上で何か他の設定ミスがあるようには見えません。

私も試しました:

server {
    error_page 500 $document_root/errors/500.html;
}

そして:

server {
    error_page 500 http://$http_host/errors/500.html;
}

そして:

server {
   error_page 500 /500.html;
   location = /500.html {
       root /path/to/errors/;
   }
}

運がなかった。

これは想定された動作ですか? エラー ページはドキュメント ルートに存在する必要がありますか、それとも何か明らかなことを見逃していますか?


アップデート1:これも失敗します:

server {
    error_page 500 /foo.html;
}

foo.html確かにドキュメント ルートに存在します。何か他のものが設定を上書きしているように見えますが、このブロックは、ディレクティブ/etc/nginx/*を参照する唯一の場所ですerror_page

nginx の設定を行える場所は他にありますか?

答え1

追加してみてください

proxy_intercept_errors on;

または

fastcgi_intercept_errors on;

構成に応じてサーバー ブロック内になります。

次のような構成は正常に動作します:

  error_page   500 502 503 504  /500.html;
    location = /500.html {
        root   /home/static/pages;
    }

答え2

これを試して:

サーバー { error_page 500 =200 /errors/500.html; }

これにより、http ステータス 200 が送信され、ブラウザにページが表示されます。デフォルトのステータス (500) では、ブラウザは独自のエラー ページを表示し、サーバーから送信された場合でもコンテンツを無視する可能性があります。

よろしく、アダム

関連情報