以下是我的 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
启用了,当我的 PHP 路由器返回 404 时,Nginx 将重定向到/404
。好的。
但由于是/404
由我的 PHP 应用程序生成的,并且我的 PHP 应用程序正确设置了404
响应代码,因此 Nginx 将尝试再次处理该错误!(这显然会以循环结束)
有针对这个的解决方法吗?
答案1
nginx 正在执行此操作,因为您告诉它这样做。
fastcgi_intercept_errors on;
这意味着nginx 将不会提供 PHP 生成的错误响应,但让 nginx 来处理它们。这样你就陷入了无限循环。
要解决该问题,请删除此指令(默认为off
)或将其明确设置为off
。
答案2
使生成错误页面的脚本返回 HTTP 200(即正确的页面),它应该立即起作用。
nginx 将检索 /404 的主体,并将响应状态更新为 404。
PS 作为奖励,您可能需要定义一个明确的位置(例如 location = /404 )并在那里打开 fastcgi_cache,这样每次需要显示错误页面时就不会查询您的 PHP 后端。