无法从 nginx 中的父文件夹提供 php 个自定义错误文件

Can't serve php custom error files from a parent folder in nginx

我有以下目录方案

/srv/www/htdocs/www/

其中 www 是 public 目录根目录,而 htdocs 包含 public 访问权限之外的文件。这是 nginx.conf

server {
    listen       443 ssl http2;

    root   /srv/www/htdocs/www;

    location / {
        index index.php;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        include fastcgi_params;
    }

    error_page 401 @errorPage;
    error_page 403 @errorPage;
    error_page 404 @errorPage;
    location @errorPage {
        root /srv/www/htdocs;
        rewrite ^ error.php?error=$status last;
    }

}

我想做的是在 401,403 和 404 触发时为 error.php 页面提供服务,但我仍然获得默认的 Nginx 404 页面,即使我以编程方式触发 403 或 401。

我在指定位置做错了吗?

root 放在 @errorPage 中毫无意义。该位置是通往 error.php 的垫脚石,最终回到 location ~ \.php$,根值为 /srv/www/htdocs/www

最简单的解决方案是将 error.php 移动到 www 目录。


如果您想将 error.php 保留在 www 目录之外,您将需要在 location @errorPage 块中复制大部分 location ~ \.php$ 块。

例如:

location @errorPage {
    fastcgi_pass  127.0.0.1:9000;
    include       fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /srv/www/htdocs/error.php;
    fastcgi_param QUERY_STRING error=$status;
}

fastcgi_param 语句 放在 include 之后,否则后者将覆盖新值。