关键是在listen指令后添加default_server参数,如listen 80 default_server;它必须作为listen修饰符,不可单独成行;ipv4与ipv6需分别设置;匹配优先级最高,不依赖server_name;常用于return 444或重定向防信息泄露。

让某个 server 块成为 Nginx 的默认虚拟主机,关键不是写 server_name _ 或留空,而是把 default_server 正确加在 listen 指令后面。
default_server 必须绑定 listen 指令
它不是独立指令,只作为 listen 的修饰符才生效:
- ✅ 正确写法:
listen 80 default_server;或listen 443 ssl http2 default_server; - ✅ IPv6 同样需要显式声明:
listen [::]:80 default_server; - ❌ 错误写法:
default_server;单独一行(Nginx 会报错) - ❌ 错误写法:同一端口协议下出现两个
default_server,比如同时写listen 80 default_server;和listen 80 default_server;
IPv4 和 IPv6 要分别设置
Nginx 按“IP:端口:协议”维度识别默认行为,IPv4 和 IPv6 是独立计算的:
- 可以共存:
listen 80 default_server;(处理 IPv4)和listen [::]:80 default_server;(处理 IPv6) - 不能省略 IPv6 配置——否则用 IPv6 地址访问时可能落到其他 server 块或报错
- HTTPS 同理:
listen 443 ssl default_server;和listen [::]:443 ssl default_server;都要写
匹配逻辑:优先级最高,不依赖 server_name
请求进来时,Nginx 先查 Host 头是否匹配任一 server_name;全部不匹配,才启用对应端口上的 default_server:
- 哪怕这个 server 块里写的是
server_name ""、server_name _;,甚至完全没写server_name,只要带default_server就能兜底 -
server_name的值对默认匹配不起作用——它只影响普通匹配阶段 - 没有显式配置
default_server时,Nginx 默认取该端口下第一个server块,但这种隐式行为不可靠,应避免依赖
典型安全配置示例
生产环境常用做法是静默拒绝或统一跳转,防止信息泄露:
- HTTP 默认兜底(关闭连接):
server {<br> listen 80 default_server;<br> listen [::]:80 default_server;<br> return 444;<br>} - HTTPS 默认兜底(需证书):
server {<br> listen 443 ssl http2 default_server;<br> listen [::]:443 ssl http2 default_server;<br> ssl_certificate /path/to/fallback.crt;<br> ssl_certificate_key /path/to/fallback.key;<br> return 444;<br>} - 也可重定向到主站:
return 301 https://www.example.com$request_uri;











