これが私の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はエラーをもう一度処理してみてください!(明らかにループで終了します)
これに対する解決策はありますか?
あなたがそう言ったので、nginxはこれをやっています。
fastcgi_intercept_errors on;
これは nginxはPHPによって生成されたエラー応答を提供しません が、代わりにnginxにそれらを処理させることを意味します。したがって、あなたはあなたの無限のループに入ります。
この問題を解決するには、このディレクティブを削除するか(デフォルトはoff
)、明示的にoff
に設定します。
エラーページを生成するスクリプトを作成してHTTP200(つまり、適切なページ)を返すと、すぐに機能するはずです。
nginxは/ 404の本体を取得し、応答ステータスを404に更新します。
P.S.ボーナスとして、明示的な場所(例:location =/404)を定義し、そこでfastcgi_cacheをオンにして、エラーページを表示する必要があるたびにPHPバックエンドが照会されないようにすることができます。