nginx默认虚拟主机兜底必须显式在listen指令后添加default_server参数,而非依赖server_name _或空值;它不参与server_name匹配,优先级最高,ipv4与ipv6需分别设置,常配合return 444等安全响应防止信息泄露。

配置 Nginx 默认虚拟主机兜底,核心是用 default_server,不是靠 server_name _ 或 server_name ""。后者只是占位写法,不加 default_server 就不会兜底。
必须显式声明 default_server
在 listen 指令后加上 default_server,才能让这个 server 块成为对应端口的兜底入口:
- HTTP 示例:
listen 80 default_server; - HTTPS 示例:
listen 443 ssl http2 default_server; - 每个监听地址+端口组合(如
127.0.0.1:80、[::]:443)最多只能有一个default_server,重复会报错
server_name _ 只是习惯写法,不是必需
server_name _; 是社区约定的“空主机头占位符”,语义清晰,但实际作用为零——它不参与匹配,也不影响兜底逻辑:
- 即使写成
server_name example.com;,只要带default_server,照样兜底 - 不写
server_name也完全可行,Nginx 不要求每个 server 块都定义它 - 加
server_name _;主要是为了避免他人误读为配置遗漏
兜底行为要明确且安全
未匹配 Host 的请求一旦落到 default_server,应快速终止或重定向,避免暴露服务器信息:
- 直接关闭连接(推荐):
return 444; - 返回 404:
return 404; - 重定向到主站(需确保目标域名已配置):
return 301 https://example.com$request_uri; - HTTPS 下必须配证书,哪怕自签最小证书,否则 TLS 握手失败
别依赖隐式第一个 server 块
没写 default_server 时,Nginx 会用该端口下第一个出现的 server 块兜底——这不可控、易出错:
- 配置顺序一变,兜底行为就变
- 可能意外暴露测试站、默认页或内部服务
- 所有生产环境都应显式设置
default_server,并确保只有一个











