Nginx,PHP + FPM自定义错误页面

我试图创build一些自定义错误页面,但似乎无法得到500人工作。

我有以下configuration:

server { listen 80; root /var/www/devsite; index index.php; server_name devsite; error_page 403 = /error.php?code=403; error_page 404 = /error.php?code=404; error_page 500 = /error.php?code=500; location / { try_files $uri =404; } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } } 

起初,我认为这可能是因为它是一个PHP文件,所以我改变了:

 error_page 500 = /error.php?code=500; 

到一个静态页面:

 error_page 500 /500.html 

但是当我破坏一些PHP代码来触发它时,它仍然只显示一个带有500个响应代码的空白页面。

然后我试图把它作为location ~ \.php$的最后一个规则,但是也是一样的。 任何想法,为什么自定义500页将无法正常工作?

我还注意到,如果您尝试访问具有.php扩展名的“访问被拒绝”文件,它将不会显示自定义403页面,而是显示内置页面。 有没有办法使规则覆盖.php文件呢?

你缺少的是fastcgi_intercept_errors指令。 如果没有这个指令,Nginx将不会触及来自CGI后端的响应,只要它们是有效的:

确定是否将FastCGI服务器的代码大于或等于300的响应传递给客户端,或者将其重定向到nginx以使用error_page指令进行处理。

您需要将以下内容放入您的PHP处理位置:

 fastcgi_intercept_errors on; 

顺便说一句 ,你可能不需要在你的error_page行(取决于你的预期用途)=。 此语法指示Nginx使用您指向的PHP脚本返回的响应代码,而不是原始响应代码:

如果错误响应由代理服务器或FastCGI服务器处理,并且服务器可能返回不同的响应代码(例如,200,302,401或404),则返回代码。