唯一可靠方式是用default_server标记监听端口的兜底server块,它绕过server_name匹配,在监听层直接路由未被显式认领的请求;http与https需分别配置,ipv4与ipv6也须各自声明,且default_server必须作为listen参数使用,不可独立成行或重复。

直接用 default_server 标记监听端口的兜底 server 块,是唯一可靠的方式。它不靠 server_name 匹配,而是在请求抵达时,由 Nginx 在监听层直接路由过去——只要没被其他 server 显式认领,就全归它管。
HTTP 和 HTTPS 必须分别配置 default_server
80 和 443 是两个独立端口,各自需要一个带 default_server 的 server 块:
-
HTTP 端口(80):写
listen 80 default_server;或listen [::]:80 default_server;(IPv6 单独声明) -
HTTPS 端口(443):必须加
ssl,如listen 443 ssl http2 default_server;,且ssl_certificate和ssl_certificate_key必须指向有效证书文件(自签名即可) - 漏掉任意一个,比如只配了 IPv4 的 443 default_server 却没配 IPv6 的,就会导致对应协议或地址族的未匹配请求落到业务 server 块里
default_server 的 listen 指令必须写对
default_server 不是独立指令,只能作为 listen 的参数出现:
- ✅ 正确:
listen 80 default_server;、listen 443 ssl default_server; - ❌ 错误:
default_server;单独一行(语法错误,Nginx 启动失败) - ❌ 错误:同一端口写两个
default_server(reload 报 “duplicate default_server”)
兜底行为靠 listen 决定,和 server_name 无关
只要标记了 default_server,Nginx 就跳过所有 server_name 比较,直接交给它处理:
- 里面写
server_name _;是惯例,语义清晰,但不是必需 - 写成
server_name example.com;或干脆不写server_name,照样响应bad.com或 IP 直连请求 - 别依赖“第一个 server 就是默认”,那是隐式 fallback,加新站点后极易出错
返回 444 静默断连最安全高效
兜底 server 块里不要返回真实内容,避免暴露结构或被滥用:
-
return 444;:Nginx 特有状态码,TCP 连接立即关闭,不发任何字节,无响应开销、无日志写入(可配合log_not_found off;) -
return 403;:适合调试阶段,能看到明确拒绝响应 - 避免
return 301重定向到主站——等于帮攻击者确认 IP 有效,还可能泄露域名











