Nginx配置default_server的核心目标是主动接管所有未匹配域名的请求,必须在listen指令后显式添加default_server参数,IPv4与IPv6需分别设置,推荐HTTP返回444、HTTPS配合ssl_reject_handshake以安全拦截。

配置 default_server 的核心目标,是让 Nginx 主动接管所有未被显式声明域名匹配的请求——包括 IP 直连、错填 Host 头、恶意解析、SNI 不匹配等场景。它不是靠 server_name 匹配生效,而是由 listen 指令上的 default_server 标志决定,且必须显式声明。
HTTP 端口(80)兜底:静默拦截最稳妥
在 80 端口设置一个专用 server 块,不提供服务,只快速断开连接:
- 写法必须是:
listen 80 default_server;(default_server是listen的参数,不能单独成行) -
server_name可写为_或留空,实际不参与匹配,仅作语义提示 - 推荐用
return 444;—— Nginx 特有状态码,直接关闭 TCP 连接,不发任何响应,比 403/404 更隐蔽、更节省资源 - 避免使用
return 301或重定向到主站,否则可能暴露真实域名或被滥用
HTTPS 端口(443)兜底:先过 TLS 握手再拦截
HTTPS 请求在应用层之前就要完成 TLS 握手,Nginx 需基于 SNI 字段选证书。若无 default_server,可能返回错误证书、握手失败,或意外透传给第一个 server:
- 必须单独配置:
listen 443 ssl http2 default_server; - 即使只是拦截,
ssl_certificate和ssl_certificate_key也必须填写有效路径(可用自签名证书,如nginx-selfsigned.crt和nginx-selfsigned.key),否则 Nginx 启动报错 - 建议搭配
ssl_reject_handshake on;(Nginx 1.19.4+ 支持),可在 TLS 握手阶段就拒绝非法 SNI,比return 444更早拦截 - 若版本较旧不支持
ssl_reject_handshake,仍用return 444;,确保握手成功后立即断连
IPv4 与 IPv6 需分别声明
Nginx 将 IPv4 和 IPv6 视为不同监听地址,default_server 必须各自设置:
- IPv4 写法:
listen 80 default_server;和listen 443 ssl default_server; - IPv6 写法:
listen [::]:80 default_server;和listen [::]:443 ssl default_server; - 漏掉 IPv6 的
default_server,会导致通过 IPv6 地址访问时落到其他 server 块,产生不可控行为
关键避坑点
这些细节常被忽略,却直接影响拦截效果:
- 同一端口不能出现两个
default_server,否则 reload 时报 “duplicate default_server” 错误 - 不要依赖“没写
default_server就自动用第一个 server”——这是隐式行为,配置变更后极易出错 -
server_name _;不等于兜底;真正起作用的是listen ... default_server; - 泛域名(如
*.example.com)或正则匹配的server_name无法替代default_server,它们仍属于“显式匹配”,对未知域名无效










