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

10

我正在尝试创建一些自定义错误页面,但好像无法让500页正常运行。

以下是我的配置:

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文件,所以我进行了更改:

一开始,我认为可能是因为这是一个PHP文件,所以我进行了更改:

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

转到一个静态页面:

error_page 500 /500.html
但是当我破坏一些PHP代码以触发它时,它仍然只显示一个空白页面和500响应代码。
然后我尝试将其变为location ~ \.php$内的最后一个规则,但结果相同。有什么想法,为什么自定义的500页面不起作用?
我还注意到,如果您尝试访问具有.php扩展名的“访问被拒绝”文件,它将不会显示自定义的403页面,而是显示内置页面。有没有办法使规则也适用于.php文件?

你的PHP error_reporting级别设置为什么?我刚回到这个问题,意识到我的答案与你的问题有些不符。 - Stecman
1个回答

22

你缺失的部分是 fastcgi_intercept_errors 指令。如果没有这个指令,只要 CGI 后端返回的响应是合法的,Nginx 就不会对它们进行任何处理:

决定是否将状态码大于等于300的 FastCGI 服务器响应传递给客户端,还是将其重定向到 nginx 并使用 error_page 指令进行处理。

你需要在 PHP 处理位置中加入以下内容:

fastcgi_intercept_errors on;

除此之外,你在error_page中可能不需要使用=(取决于你的使用意图)。这种语法指示Nginx使用指向的PHP脚本返回的响应代码而不是原始响应代码:

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


1
我在 location ~ .php$ 中添加了那行代码,现在我的 PHP 生成的 404 页面不起作用了。只有静态页面似乎能够正常工作?如果我尝试使用 PHP 脚本,它只会显示 Nginx 的通用错误。 - Ken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接