如何让nginx始终为默认主机返回自定义404

时间:2011-09-23 09:38:05

标签: nginx

我设置了nginx 0.8.53,其中一些虚拟主机可以正常工作。但是由于nginx在虚拟主机上的“最佳匹配”,我需要添加一个默认主机来捕获不适用于特定虚拟主机的所有请求。我希望默认主机返回404页面,但不会说明我正在运行nginx 0.8.53。

我认为这应该是这样的:

# The default server.
#
server {
    listen       80 default_server;
    server_name  everythingelse;

    # Everything is a 404
    location / {
        return 404;
    }
    error_page 404 /opt/local/html/404.html;
}

但是这仍然会返回具有版本号的默认nginx 404页面。似乎'return 404'忽略'error_page'配置..

6 个答案:

答案 0 :(得分:28)

这就是我在我的conf中所做的工作:

# The default server.
server {
  listen       80 default_server;
  server_name  everythingelse;

  error_page 404 /404.html;

  # Everything is a 404
  location / {
    return 404; #return the code 404
  }

  # link the code to the file
  location = /404.html {
    #EDIT this line to make it match the folder where there is your errors page
    #Dont forget to create 404.html in this folder
    root  /var/www/nginx/errors/;
  }
}

答案 1 :(得分:4)

nginx中很少有指令采用文件系统路径。你想要这样的东西:

# The default server.
server {
  listen       80 default_server;
  server_name  everythingelse;

  root /opt/local/html;

  error_page 404 /404.html;

  # Everything is a 404
  location / {
    return 404;
  }

  # EDIT: You may need this to prevent return 404; recursion
  location = /404.html {
    internal;
  }
}

答案 2 :(得分:2)

在调用return 404之前,将error_page指令向上移动到conf。

这应该有效:

# The default server.
#
server {
    listen       80 default_server;
    server_name  everythingelse;
    error_page 404 /error_docs/404.html;

    # Everything is a 404
    location / {
        return 404;
    }

    # Custom Error Page
    location /error_docs {
        alias /opt/local/html/;
        log_not_found  off;
        access_log off;
    }
}

这将对所有站点(服务器)使用相同的自定义。您需要添加错误文档位置。

http {
error_page 404 /error_docs/404.html;

...

    # The default server.
    #
    server {
        listen       80 default_server;
        server_name  everythingelse;

        # Everything is a 404
        location / {
            return 404;
        }

        # Custom Error Page
        location /error_docs {
            alias /opt/local/html/;
            log_not_found  off;
            access_log off;
        }
    }
}

答案 3 :(得分:0)

由于rooterror_page都是http块范围内的有效指令,因此可以利用nginx配置的继承行为。

要在我的所有虚拟主机之间共享自定义错误页面(以便未知虚拟主机上的请求或已知虚拟主机中不存在的资源根据error_page定义将我的自定义错误页面作为响应),我使用以下方法。

1 / 将这三行添加到/etc/nginx/nginx.conf

# …
root /var/www/whatever # Used by undefined hosts
error_page 403 404 =404 /404.html
error_page 502 503 504 =500 /500.html
# …

2 / 使用以下代码段创建/etc/nginx/sites-available/catchall作为«catch all»默认虚拟服务器。

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    # SSL rules here if required
    server_name _;
}

3 / 在每个文档根目录中创建404.html和500.html文件必须使用自定义错误(或链接/ var / www / whatever中的文件),否则默认值为改为使用。

尽管如此,并非所有指令都可以从更高级别的范围继承,更糟糕的是,某些继承的行为与初看起来的方式不同。
- Understanding the NGINX Configuration file structure and configuration context
- 有趣的SO主题:Location nesting

(使用Debian9nginx/1.10.3

答案 4 :(得分:0)

在使用Server bloc之前,您可能正在使用include指令:

include /etc/nginx/conf.d/*.conf;
server {
    listen 80;
    ...
}

我遇到了同样的问题,我只评论了这一行,它对我有用

#include /etc/nginx/conf.d/*.conf;
server {
    listen 80;
    ...
}

答案 5 :(得分:0)

在NGINX版本1.14(于2019年12月26日发行)中,您不能使用 location = /404.html 来代替= =等号来完成工作,请检查以下配置:

server {
    listen 80;

    server_name everythingelse;
    error_page 404 /404.html;

    location / {
        return 404;
    }

    location /404.html {
        root /opt/local/html;
    }
}