Dou*_*hen 3 nginx virtualhost custom-errors
我在 nginx 上运行了一些虚拟主机,我希望它们每个都有自己的自定义 404 页面。每个虚拟主机都有自己的 nginx.conf,我包括我的全局 nginx.conf。
在我目前无法正常工作的特定虚拟主机的配置文件中,配置块如下所示:
server{
listen 80;
server_name www.foo.com;
expires 1M;
access_log /srv/www/foo/logs/acces.log;
error_log /srv/www/foo/logs/error.log;
error_page 404 /404.html;
location / {
root /srv/www/foo/public_html;
index index.html;
rewrite ^/(.*)/$ /$1 permanent;
try_files "${uri}.html" $uri $uri/ =404;
}
location = /404.html {
internal;
}
}
Run Code Online (Sandbox Code Playgroud)
404'ing 本身没问题,但是当返回 404 状态代码时,将显示默认的 nginx 404 页面,而不是位于站点根目录中的自定义页面 404.html。
我已经尝试通过文件系统和站点的 URI 绝对路径到错误页面,并且我已经尝试将 error_page 指令放在位置块中。这些都没有奏效。我怀疑问题出在我用来“美化”我的 URL 的重写和 try_files 组合中。
首先,在 location 块之外设置你的 root 指令 - 在这种情况下,在 error_page - 指令之上。请参阅 nginx陷阱页面。这样做的原因是许多指令(包括 error_page)需要知道相对于某些东西的路径 - 并且所有路径都被假定为相对路径(即 /404.html 不在文件系统的根目录中 - 它相对于您的文档根)。
server{
#listen 80; - not needed
server_name www.foo.com;
root /srv/www/foo/public_html;
expires 1M;
access_log /srv/www/foo/logs/access.log;
error_log /srv/www/foo/logs/error.log;
error_page 404 /404.html;
location / {
index index.html;
rewrite ^/(.*)/$ /$1 permanent;
try_files "${uri}.html" $uri $uri/ =404;
}
location = /404.html {
internal;
}
}
Run Code Online (Sandbox Code Playgroud)
如果上述方法不能解决您的错误,请增加您的error_log的详细程度(例如,“信息”)并查看当您遇到 404 时 nginx 实际服务的页面。