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文件所以改了:

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

到静态页面:

error_page 500 /500.html

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

然后我试图让它成为里面的最后一条规则,location ~ \.php$但同样的事情发生了。任何想法为什么自定义 500 页面不起作用?

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

4

1 回答 1

22

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

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

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

fastcgi_intercept_errors on;

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

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

于 2014-03-20T21:10:16.100 回答