Nginx 默认页面的自定义状态码

Nie*_* B. 9 ubuntu nginx

我只有 Nginx 上游的经验,而不是静态文件的服务。

Nginx 有一个默认服务器,它提供欢迎使用 nginx!页面并在虚拟主机上没有匹配项时显示。我想保留此默认页面,但将200状态代码覆盖为404

我不知道该怎么做。有任何想法吗?

Ryd*_*der 7

您可以使用返回带有错误代码的页面

error_page 404 /index.html;
Run Code Online (Sandbox Code Playgroud)

只要root在您的服务器块中定义为 nginx 的默认路径。Nginx.org 有关于所有这些的大量文档,值得一看。

重写 200

是危险的。但是,您可以使用return对服务器中其他任何位置的请求进行响应,这将正确调用 error_page 指令。如果你把它放在你的 server 块的底部,它将作为一个包罗万象的请求没有在其他地方指定:

location / {
    return 404;
}
Run Code Online (Sandbox Code Playgroud)

以下return.

为了真正迂腐,您还可以省略 error_page 指令,而只编写重定向 URL(对于从 0.8.42 版本开始的代码 301、302、303、307 和 308):

location / { 
    root /path/to/www/nginx;
    return 301 /index.html;
}
Run Code Online (Sandbox Code Playgroud)

或者响应正文(对于其他代码):

location / { 
    root /path/to/www/nginx;
    return 404 '404 error';
}
Run Code Online (Sandbox Code Playgroud)

...但如果出现任何问题,这可能很难解决。


一点阐述

Nginx 有一个相当简单的语法来区分状态代码和页面。在一个server块中,您可以定义rootnginx 将在何处查找请求的静态页面。当请求静态页面但未找到,或无法读取,或发生其他情况时,nginx 会获取状态代码并执行操作。如果该代码是 200,它会处理 html、php 或其他任何内容,这些内容可以(并且经常会)触发对文件系统或其他某个套接字的一系列请求,以提供页面的这个或那个部分。成功的结果被发送到浏览客户端,失败时返回错误的默认页面。在这两种情况下,都会返回状态代码(允许浏览器端自定义 404 和其他错误)。

error_page指令只是告诉 nginx 下一步要遵循什么请求。实际上,这个请求甚至不必是磁盘上的文件。它可以是location具有自己的规则集的命名。nginx 的默认配置很好地说明了这一点:

error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root /usr/share/nginx/www;
}
Run Code Online (Sandbox Code Playgroud)

因此,在获得 503 时,nginx 将请求 /50x.html,并且对 50x.html 的任何请求的位置语句定义了查找此文件的根路径。

  • `return 404 /index.html;` 并没有按照我的想法去做。它返回 400 状态代码和_text_“/index.html”(不是该页面的内容)。 (7认同)