nginx自定义虚拟主机的404错误页面

我在nginx上运行了一些虚拟主机,我希望他们每个都有自己的404页面。 每个虚拟主机都有自己的nginx.conf,包含我的全局nginx.conf。

在特定虚拟主机的configuration文件中,我目前无法正常工作,configuration块如下所示:

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; } } 

404'本身就没有问题,但是当404状态代码返回时,将显示默认的nginx 404页面,而不是显示在站点根目录下的自定义页面404.html。

我已经尝试通过文件系统和网站的URI到错误页面的绝对path,我试图把error_page指令放在位置块。 这些都没有工作。 我的怀疑是,问题来自我用来“美化”我的url的重写和try_files组合。

首先,在位置块之外设置根指令 – 在这种情况下,在error_page – 指令之上。 查看nginx 陷阱页面 。 这是因为许多指令(包括error_page)需要知道相对于某些东西的path – 并且所有的path被认为是相对的(即/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; } } 

如果上述内容不能解决你的错误,请增加error_log的详细程度(例如:'info'),看看当你点击404时nginx实际上正在提供什么页面。