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

Tim*_*m P 21 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,这仍然返回具有版本号默认nginx的404页..看来"回404"忽略"error_page"配置..

0x1*_*ene 29

这就是我在我的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/;
  }
}
Run Code Online (Sandbox Code Playgroud)


kol*_*ack 6

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 也许redhat 为你提供了一些通用的错误页面,但是原生的nginx 错误页面是由src/http/ngx_http_special_response.c 生成的。如果您没有指定自定义的 error_page,这就是将生成响应的内容。正如我之前所说, error_page 接受一个 uri 参数,但是 OP 和您的原始答案都将该参数视为文件系统路径。 (3认同)
  • 默认的 404 页面根本不是文件,并且 error_page 不*不*采用文件系统路径。它在内部重定向到给定的 uri,因此它会寻找 /404.html。可能需要添加 location = /404.html { internal; 或类似以防止显示默认的 404 页面,现在我考虑了一下,因为内部重定向最终会回到位置 / 并且我不确定返回 404 是什么;将在没有 recursive_error_pages 的情况下进行;(无论如何这会很糟糕)。 (2认同)
  • location 和 error_page 的顺序无关紧要,所以只是移动它们不会改变任何东西。我的配置和您修改后的配置都以(几乎)相同的方式返回错误页面。一个对/foo的请求进来,选择位置/,返回404查找错误页面,找到它,执行内部重定向到/404.html,选择位置/404.html。该位置使用默认(静态)内容处理程序,因此它使用来自服务器的根并为 /opt/local/html/404.html 提供 404 状态。 (2认同)

Day*_*ayo 3

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

这应该有效:

# 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)