无法从 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
之后,否则后者将覆盖新值。
我有以下目录方案
/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
之后,否则后者将覆盖新值。