我设置了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'配置..
答案 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)
由于root
和error_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
(使用Debian9
和nginx/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;
}
}