最有效安全的兜底方式是配置带default_server标识的server块并return 444。需为80和443端口分别配置,ipv6单独声明,server_name _仅为语义占位,不可用通配符或空字符串,业务server必须显式列出合法域名。

直接配置一个带 default_server 标识的兜底 server 块,用 return 444 静默关闭连接,是最有效、最安全的方式。
必须加 default_server 才能真正兜底
Nginx 不是靠 server_name _ 来匹配未知请求的,而是靠 listen ... default_server 指定哪个 server 块作为该端口的默认入口。没有这个标记,即使写了 server_name _,请求仍可能落到其他 server 块(按配置顺序第一个能“凑合匹配”的)。
- 每个监听端口(如
80和443)只能有一个default_server,重复会报错 - 建议把兜底块放在配置文件末尾,避免被前面的 server 块意外覆盖
- IPv6 也需单独声明:
listen [::]:80 default_server
推荐配置写法(HTTP)
在 http 块中添加:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}
-
server_name _是语义占位,表示“无实际域名”,不参与匹配,但让配置更清晰 -
return 444是 Nginx 特有状态码:立即断开 TCP 连接,不发任何响应体,比403或404更彻底,防爬虫、防恶意解析效果更好 - 不要用
server_name ""(空字符串),它匹配行为不稳定,不如default_server可靠
HTTPS 场景不能省略
HTTP 和 HTTPS 是独立监听,SNI 协商阶段就需确定 server 块。如果没配 HTTPS 的兜底,默认可能返回错误证书或握手失败,甚至被绕过。
- 必须单独为 443 端口配置 default_server:
server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name _; ssl_certificate /path/to/empty.crt; # 可用自签占位证书 ssl_certificate_key /path/to/empty.key; return 444; }- 若不想维护证书,也可改用
return 403或重定向到 HTTP 主站(但安全性略低)
配合业务 server 块一起生效
兜底块只在“没有其他 server 显式匹配 Host 头”时触发。所以你的业务 server 必须明确写出合法域名:
- ✅ 正确:
server_name example.com www.example.com api.example.com; - ❌ 错误:
server_name ;或server_name ""或server_name *.example.com;—— 这些会让 server 块退化成隐式兜底,反而破坏防护逻辑 - 子域名必须显式列出,禁用通配符,才能确保非法子域名(如
hacker.example.com)落入 default_server 被拦截











