应配置 default_server 拦截 ip 访问:在所有业务 server 块前定义监听 80/443 的兜底 server,server_name 设为 _ 并 return 444;业务 server 中必须明确列出合法域名,不可设为 ip 或空值,且不可遗漏 server_name 指令。

核心思路是:让所有未匹配到合法 server_name 的请求(即直接用 IP 访问的请求)被一个“兜底 server”捕获并拒绝,而不是落到你的业务站点配置里。
添加 default_server 拦截 IP 访问
在 Nginx 配置中,必须在所有业务 server 块之前,定义一个监听 80(和/或 443)端口、带 default_server 标识的 server 块。它会处理所有未被其他 server_name 明确匹配的请求:
- 使用 server_name _;(下划线)作为通配占位符,不匹配任何真实域名
- 搭配 return 403; 或 return 444;(静默关闭连接,更隐蔽)
- 同时监听 HTTP 和 HTTPS 可覆盖更多场景
示例配置:
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
return 444; # 或 return 403;
}
确保业务 server 不响应 IP 请求
你的实际站点 server 块中,不要设置 server_name 为 IP 地址或空值,也不要遗漏 server_name 指令。正确写法是明确列出允许的域名:
- ✅ 正确:
server_name example.com www.example.com; - ❌ 错误:
server_name 192.168.1.100;或server_name "";或完全不写server_name
如果漏写 server_name,Nginx 会默认将其视为匹配任意 Host,IP 请求就可能意外命中该块。
验证配置是否生效
修改后务必执行以下操作:
- 运行
sudo nginx -t检查语法 - 执行
sudo nginx -s reload重载配置 - 在浏览器或终端中直接访问
http://你的服务器IP,应看到连接被拒绝(444)或 403 页面 - 再访问
http://example.com,确认网站仍正常工作
注意:若使用 CDN 或反向代理,需确保真实客户端 IP 未被覆盖,否则 default_server 仍可能失效。











