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

nginx:如何始终为默认主机返回自定义404页面,nginx,Nginx,我已经为nginx 0.8.53配置了一些虚拟主机,这些主机可以按需要工作。然而,由于nginx在虚拟主机上的“最佳匹配”,我需要添加一个默认主机来捕获所有不针对特定虚拟主机的请求。我希望默认主机返回我创建的自定义404页面,而不是默认的nginx404页面 我以为我需要这样的东西: # The default server: server { listen 80 default_server; server_name everythingelse; #

我已经为nginx 0.8.53配置了一些虚拟主机,这些主机可以按需要工作。然而,由于nginx在虚拟主机上的“最佳匹配”,我需要添加一个默认主机来捕获所有不针对特定虚拟主机的请求。我希望默认主机返回我创建的自定义404页面,而不是默认的nginx404页面

我以为我需要这样的东西:

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

但这仍然返回默认的nginx404页面。似乎
return404
忽略了
error\u页面
config。

在调用return404之前,将error\u页面指令向上移动到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;
        }
    }
}

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

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

以下是我的配置文件中的功能:

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

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

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

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/where中的文件),否则将使用默认值

也就是说,并不是所有指令都可以从更高级别的范围继承,更糟糕的是,有些继承是非直观的,并且不像您预期的那样

  • 有趣的是:

(使用
Debian9
nginx/1.10.3

服务器
块之前,您可能正在使用
包含
指令:

include /etc/nginx/conf.d/*.conf;
server {
    listen 80;
    ...
}
我也有同样的问题,并通过删除
include
行修复了它:

server {
    listen 80;
    ...
}
在NGINX v1.14(2019-12-26发布)中,您不能使用location=/404.html。删除
=
(等号)可以:


你的代码会给他默认的404页面,他说他不想要(而且已经得到了),其次,error\u page指令允许你指定一个自定义错误页面。事实上,“error_page 404/404.html”只是指使用nginx安装文件夹中的404.html文件(默认404文件)。这也可以是“error\u page 404/path/to/any/other/404.html”。或者,他可以更改默认文件本身。默认的404页面根本不是文件,error\u page也不采用文件系统路径。它会在内部重定向到给定的uri,因此会查找/404.html。现在我想起来了,可能需要添加location=/404.html{internal;}或类似的内容来防止显示默认的404页面,因为内部重定向将直接返回location/并且我不确定返回404的是什么;将在那里做没有递归错误的页面;“默认的404页面根本不是文件”是不正确的。您可以在/usr/share/nginx/html/文件夹中找到它(在redhat上-对于其他人可能不同)。error\u page指令使用一个uri,该uri可以位于webroot下,也可以根据需要使用别名。也许redhat为您提供了一些通用错误页面,但本机nginx错误页面是由src/http/ngx\u http\u special\u response.c生成的。如果未指定自定义错误页面,则将生成响应。正如我之前所说的,error_页面接受一个uri参数,但是OP和您的原始答案都将该参数视为文件系统路径。位置和error_页面的顺序并不重要,所以仅仅移动它们不会改变任何事情。我的配置和你修改过的配置返回错误页面的方式(几乎)相同。对/foo的请求进入,选择location/,返回404查找错误页面,找到它,执行内部重定向到/404.html,该页面选择location/404.html。该位置使用默认(静态)内容处理程序,因此它使用服务器的根目录,并以404状态提供/opt/local/html/404.html。顺便说一句,您可以忽略
root/var/www/nginx/errors/中的最后一个
/
。写为
root/var/www/nginx/errors