我试图为我的整个nginx服务器设置一个默认的error_page(如在所有虚拟主机中)。
我正在用下面的代码尝试它:
http { ... ... error_page 404 /var/www/default/404.html; ... ... }
另外,我希望能够创build一个虚拟主机,并使其使用默认的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是绝对path,而不是附加到我的虚拟主机的根目录。
任何想法如何做到这一点?
问候
正如您已经发现的那样, error_page指令指定了一个与文档root相关的文档。
解决这个问题的一个方法是创build一个单独的文件,其中包含您的错误页面规范,其中包含适当的location块,然后include来自每个使用“全局” error_page server error_page 。
例如,一个文件/etc/nginx/global404 :
location = /404.html { root /var/www/default; } error_page 404 /404.html;
现在在每个server块中,您将:
include global404;
似乎error_page只有在服务器/位置中没有其他error_page指令时才被inheritance。 因此,要重置您的服务器的error_page 404,只需设置其他错误页面,如:
server { error_page 399 /; }
这个服务器不会inheritance'html'块中的error_page 404(以及其他)。
我打算使用之前提交的include方法,但是为了彻底,可以使用另一种方法:使用符号链接。 对于您pipe理的每个虚拟主机,仍然需要额外的操作,但确实提供了不需要进一步更改服务器configuration和重新启动的好处。
http { ... ... error_page 404 /error/404.html; ... ... }
…然后在每个鬼的根…
ln -s [path to error page html directory] /[vhost root]/error
这种方法让我觉得不够优雅和不可移植(如果我有足够的代表来投票选举,那么我就会投票),但是这个方法很有效。