我仅具有 Nginx 上游的经验,没有提供静态文件的经验。
Nginx 有一个默认服务器,它为欢迎使用 nginx!页面,并在虚拟主机上没有匹配项时显示。我想保留此默认页面,但覆盖200状态代码404。
我不知道该怎么做。有什么想法吗?
答案1
您可以使用以下方式返回带有错误代码的页面
error_page 404 /index.html;
只要root
在您的服务器块中将其定义为 nginx 的默认路径即可。Nginx.org 有详尽的文献资料所有这些都值得一看。
重写 200
很危险。但是,您可以使用return
它来响应对服务器中其他任何地方的请求,这将正确调用 error_page 指令。如果您将其放在服务器块的底部,它将充当未在其他地方指定的请求的捕获器:
location / {
return 404;
}
这里是 的文档return
。
为了真正严谨,您还可以省略 error_page 指令,而只编写重定向 URL(对于从 0.8.42 版本开始的代码 301、302、303、307 和 308):
location / {
root /path/to/www/nginx;
return 301 /index.html;
}
或者响应正文(适用于其他代码):
location / {
root /path/to/www/nginx;
return 404 '404 error';
}
...但如果出现任何问题,这可能会很难排除故障。
稍微阐述一下
Nginx 具有相当简单的语法来区分状态代码和页面。在一个server
块内,您可以定义root
nginx 查找所请求的静态页面的位置。当请求静态页面但未找到、无法读取或发生其他情况时,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;
}
因此,当出现 503 时,nginx 将请求 /50x.html,并且对 50x.html 的任何请求的位置语句定义了查找此文件的根路径。