nginx 未定义主机名请求必须由显式声明 default_server 的 listen 指令触发,http 和 https 端口需分别配置 listen 80 default_server 和 listen 443 ssl default_server,配合 return 444 静默断连,并通过独立优先加载的配置文件确保生效。

要让 Nginx 在遇到未定义主机名(比如用 IP 直接访问、输错域名、恶意解析)时,准确走 default_server 并立即关闭连接,关键不是写对 server_name _,而是必须在 listen 指令中显式声明 default_server——这是唯一生效的触发条件。
HTTP 端口(80)必须单独配 default_server
同一端口只能有一个 default_server,且它不依赖 server_name 的值。哪怕你写 server_name example.com;,只要加了 listen 80 default_server;,它就会兜底所有 Host 不匹配或空 Host 的请求。
- 监听 IPv4 和 IPv6 都要覆盖:
listen 80 default_server;和listen [::]:80 default_server; -
server_name可写_(语义清晰)、留空或任意无效值,实际不参与匹配 - 用
return 444;静默断连,不发任何响应头,比 404 更干净
HTTPS 端口(443)必须单独且完整配置
HTTPS 不能复用 HTTP 的 default_server,因为 TLS 握手阶段就要选证书。若没配 listen 443 ssl default_server,客户端可能拿到错误证书、握手失败,或意外落到业务块里。
- 必须带
ssl和default_server:例如listen 443 ssl http2 default_server; - 必须提供有效证书(哪怕是自签名或泛域名证书),否则 Nginx 启动报错或 SNI 匹配异常
- 同样用
return 444;,避免泄露服务信息
配置顺序和加载优先级要注意
Nginx 按文件字典序读取虚拟主机配置。如果你把 default_server 块放在某个业务配置文件末尾,而该文件又排在前面加载,就可能被其他 server 块抢先占位为“事实上的默认”。
- 推荐新建一个独立文件,如
/etc/nginx/conf.d/00-default-server.conf,用数字前缀确保最先加载 - 文件内只放 default_server 块,不混业务配置,降低误匹配风险
- 修改后务必运行
nginx -t校验语法,再nginx -s reload
常见误区与验证方法
很多人以为删掉 server_name 或写成 server_name ""; 就能兜底,其实完全无效;还有人只配了 80 的 default_server,却忽略 443,导致 HTTPS 下 IP 仍可通。
- 验证是否生效:用
curl -H "Host: fake.example" http://your-ip和curl -k https://your-ip测试,应无响应或连接被重置 - 检查日志:正常情况下,这些请求不应出现在业务 access_log 中;如果出现,说明 default_server 未命中
- 注意 SNI:老客户端(如部分嵌入式设备)不发 SNI,此时 443 的 default_server 是唯一可靠拦截点











