直接配置显式default_server块即可拦截未匹配请求:HTTP用listen 80 default_server+return 444;HTTPS需listen 443 ssl default_server并配证书,返回444静默断连,server_name值不影响匹配逻辑。

直接在 Nginx 配置中加一个显式标记 default_server 的 server 块,监听 80 和 443 端口,并返回静默断连(444)或明确拒绝(403/404),就能拦截所有未匹配的域名请求。关键不是 server_name 写什么,而是 listen 指令是否带 default_server 参数。
必须为每个端口单独配置 default_server
HTTP 和 HTTPS 是两个独立端口,需分别声明 default_server:
- 80 端口:用
listen 80 default_server; - 443 端口:用
listen 443 ssl http2 default_server;,且必须配有效证书(哪怕自签名),否则 TLS 握手失败 - IPv6 需额外写
listen [::]:80 default_server;和listen [::]:443 ssl default_server; - 同一端口不能出现两个 default_server,否则 nginx -t 报错
server_name 可以留空、写 _ 或任意值
default_server 的匹配逻辑完全不依赖 server_name:
- 写
server_name _;是惯例,语义清晰,但非必需 - 写
server_name example.com;也照样兜底,只要它被标记为 default_server - 甚至可以不写 server_name 这行,Nginx 仍会把它当作默认入口
推荐返回方式:优先用 444 静默关闭连接
444 是 Nginx 特有状态码,不发任何响应体,直接断开 TCP 连接,对恶意扫描和反代最有效:
-
return 444;—— 无日志、无响应、无资源消耗 - 避免用
return 404;或return 301;,前者暴露服务存在,后者可能被滥用跳转 - 如需友好提示,可用
return 403;+ 自定义 error_page,但要确保页面极简、无敏感信息
验证是否生效的简单方法
不用等别人绑域名,自己就能测:
- 用 curl 模拟非法 Host:
curl -H "Host: fake.site" http://your-ip - 用 resolve 强制走 IP:
curl --resolve "bad.com:80:your-ip" http://bad.com - 检查访问日志里该请求是否进了 default_server 对应的 log_path
- 运行
nginx -t && nginx -s reload确保配置已加载











