nginx默认兜底服务由listen指令中的default_server参数决定,而非server_name匹配;必须为80和443端口分别显式配置listen 80 default_server和listen 443 ssl default_server,并推荐返回444静默断连。

在 Nginx 中,所谓“默认捕获兜底服务”,就是当请求的 Host 头无法匹配任何已定义的 server_name 时,由某个特定 server 块统一响应。这不是靠 server_name 匹配实现的,而是由 listen 指令中的 default_server 参数决定的。
明确设置 default_server 标志
在监听语句中添加 default_server,才能让该 server 块成为对应端口的兜底入口:
- 同一端口(如
80或443)只能有一个default_server - 未加该标记时,Nginx 会取配置文件中该端口下第一个
server块作为默认,但行为不稳定,不推荐依赖 - 示例写法:
listen 80 default_server;或listen 443 ssl http2 default_server;
server_name 在兜底场景中不起匹配作用
一旦某 server 被标记为 default_server,它的 server_name 值就不再参与 Host 匹配判断:
- 写成
server_name _;是常见习惯,仅表示“无特定域名”,不是必需 - 即使写成
server_name example.com;,它依然会响应unknown-site.org的请求 - 真正起效的是
listen ... default_server,不是server_name
HTTP 和 HTTPS 必须分别配置
因为 HTTP 和 HTTPS 使用不同端口、不同协议栈,兜底逻辑需独立设置:
- HTTP 默认兜底:在
listen 80 default_server的块中处理 - HTTPS 默认兜底:必须额外配置
listen 443 ssl default_server,否则不支持 SNI 的客户端或非法 Host 可能握手失败 - HTTPS 下建议配一个基础证书(如自签名或泛域名证书),避免 TLS 层直接报错
- 可返回
return 444(静默关闭)、return 404或重定向到主站
验证是否生效的实用方法
用真实请求模拟未匹配场景,观察响应行为:
- 用 IP 直连并伪造 Host:
curl -H "Host: fake.example" http://192.168.1.100/ - 强制解析域名到服务器 IP:
curl --resolve "bogus.site:80:192.168.1.100" http://bogus.site/ - 检查错误日志:
tail -f /var/log/nginx/error.log,看是否有 “no suitable server” 类警告 - 每次修改后务必执行:
nginx -t && nginx -s reload











