Nginx默认兜底虚拟主机需在listen指令后添加default_server参数,同一端口协议下仅允许一个,且优先级高于server_name匹配;IPv4与IPv6需分别设置,常用于返回444或404防止信息泄露。

要让 Nginx 用某个虚拟主机(server 块)作为默认兜底,处理所有未被其他 server 块匹配的请求(比如输错域名、直接用 IP 访问、或 Host 头为空),关键在于在该 server 块中显式声明 default_server 参数。
1. default_server 必须加在 listen 指令上
它不是 server 块的独立指令,而是 listen 的修饰符。只写 default_server 不生效,必须和 listen 绑定:
- ✅ 正确写法:
listen 80 default_server; - ✅ 支持 HTTPS:
listen 443 ssl http2 default_server; - ❌ 错误写法:
default_server;(单独一行,Nginx 启动会报错)
2. 同一端口+协议下只能有一个 default_server
Nginx 按“IP:端口:协议”维度判断默认行为。例如:
-
listen 80 default_server;和listen 80;可共存,前者是默认; - 但不能有两个
listen 80 default_server;,否则 reload 时提示 “duplicate default_server in …”; - 如果监听了
listen [::]:80(IPv6),也需单独指定default_server,IPv4 和 IPv6 是分开计算的。
3. default_server 匹配逻辑优先于 server_name
当请求到达时,Nginx 先看 Host 请求头是否匹配某个 server_name;若都不匹配,再看对应端口是否有 default_server。注意:
- 即使你写了
server_name _;或server_name "";,只要没加default_server,它就只是普通 server,不会兜底; -
default_server不依赖server_name,哪怕里面写server_name "";或干脆不写,也能生效; - 常见做法是在 default_server 块里返回 444(关闭连接)或 404,或重定向到主站,避免暴露内部结构。
4. 实际配置示例
以下是一个安全、清晰的 default_server 配置片段(放在 /etc/nginx/sites-enabled/ 或主配置中):
server {
listen 80 default_server;
listen [::]:80 default_server;
<pre class="brush:php;toolbar:false;"># 可选:防止通过 IP 直接访问泄露站点列表
return 444;
}
server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server;
ssl_certificate /path/to/default.crt; ssl_certificate_key /path/to/default.key; # 返回统一的 404 页面,不暴露真实服务 return 404;
}
配置完记得执行 nginx -t 测试语法,再 systemctl reload nginx 生效。










