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

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

我正在 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;
    }       
}

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

我尝试过通过文件系统和站点的 URI 来绝对路径指向错误页面,也尝试过将 error_page 指令放在 location 块中。但这些方法都不起作用。我怀疑问题出在我用来“美化” URL 的 rewrite 和 try_files 组合上。

答案1

首先,在 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;
    }       
}

如果上述方法不能解决您的错误,请增加您的错误日志(例如“info”)并查看当你遇到404时nginx实际正在提供的页面。

相关内容