web-dev-qa-db-ja.com

PHP)によって生成されたカスタム404ページを提供します

これが私のphp-fpm設定です:

location @site {
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root/index.php;

    fastcgi_intercept_errors on;
    error_page 404 /404;
}

fastcgi_intercept_errorsが有効になっているため、my PHPルーターが404を返すと、Nginxは/404にリダイレクトします。Good

しかし、/404はmy PHPアプリケーションによって生成され、my PHPアプリケーションは404応答コードを正しく設定するため、Nginxはエラーをもう一度処理してみてください!(明らかにループで終了します)

これに対する解決策はありますか?

5
Matthieu Napoli

あなたがそう言ったので、nginxはこれをやっています。

    fastcgi_intercept_errors on;

これは nginxはPHPによって生成されたエラー応答を提供しません が、代わりにnginxにそれらを処理させることを意味します。したがって、あなたはあなたの無限のループに入ります。

この問題を解決するには、このディレクティブを削除するか(デフォルトはoff)、明示的にoffに設定します。

5
Michael Hampton

エラーページを生成するスクリプトを作成してHTTP200(つまり、適切なページ)を返すと、すぐに機能するはずです。

nginxは/ 404の本体を取得し、応答ステータスを404に更新します。

P.S.ボーナスとして、明示的な場所(例:location =/404)を定義し、そこでfastcgi_cacheをオンにして、エラーページを表示する必要があるたびにPHPバックエンドが照会されないようにすることができます。

0
galaxy