我正在尝试为我的整个 nginx 服务器(如所有 vhost)设置一个默认的 error_page。
我正在尝试使用以下代码:
http {
...
...
error_page 404 /var/www/default/404.html;
...
...
}
此外,如果我没有明确编写另一个,我希望能够创建一个 vhost 并使其使用默认的 404.html。
就像是:
server {
...
server_name mydomain.com
root /var/www/mydomain.com/;
...
}
无论如何,我收到了以下错误:
[error] 16842#0: *1 open() "/var/www/mydomain.com/var/www/default/404.html" failed (2: No such file or directory)
虽然我确实理解这个错误,也理解为什么会发生这种情况,但我不明白为什么我不能告诉 NGINX 使用默认的 error_page 作为绝对路径,而不是将其附加到我的 vhost 的根目录。
你知道怎样做吗?
问候
答案1
正如您已经发现的,该error_page
指令指定了一个与文档相关的文档root
。
解决此问题的一种方法是创建一个单独的文件,其中包含错误页面规范,其中包含适当的location
块,然后include
每个server
块都将使用“全局” error_page
。
例如,一个文件/etc/nginx/global404
:
location = /404.html {
root /var/www/default;
}
error_page 404 /404.html;
现在在每个server
区块中,您将:
include global404;
答案2
似乎仅当 server/location 中没有其他 error_page 指令时,error_page 才会被继承。因此,要重置服务器的 error_page 404,只需设置其他错误页面,例如:
server {
error_page 399 /;
}
该服务器不会从“html”块继承error_page 404(以及任何其他)。
答案3
我计划使用include
之前提交的方法,但为了彻底起见,我还有一个替代方法:使用符号链接。它仍然需要对您管理的每个虚拟主机进行额外的操作,但它确实提供了不需要进一步更改服务器配置和重新启动的好处。
http {
...
...
error_page 404 /error/404.html;
...
...
}
...然后在每个虚拟主机的根目录中...
ln -s [path to error page html directory] /[vhost root]/error
这种方法在我看来不够优雅且不便于移植(如果我有足够的代表来投票赞成或反对,我会投反对票)但它确实有效。