Nginx需配置default_server拦截IP直连:在80和443端口分别设置listen 80 default_server与listen 443 ssl default_server,server_name _,并return 444断连;HTTPS须配有效证书,配置须置于所有server块之前且通过nginx -t验证后reload生效。

直接用 IP 访问网站,看似无害,实则存在安全与合规隐患:他人可将未备案域名解析到你的服务器 IP,触发监管风险;爬虫或扫描工具会通过 IP 收集站点信息,暴露路径、版本等敏感细节;清网行动期间,IP 直连常被列为违规项。Nginx 本身不默认拦截 IP 访问,需主动配置“兜底 server”来接管并拒绝这些请求。
核心原理:用 default_server 拦截未匹配的请求
Nginx 在收到请求时,会按 server_name 匹配所有 server 块。若没有一个 server 的 server_name 与 Host 头(即用户输入的域名或 IP)匹配,就会交给标记了 default_server 的那个 server 处理。我们正是利用这一点,建一个“兜底 server”,专收 IP 访问和非法域名访问。
- listen 指令必须带 default_server 参数(如
listen 80 default_server;),否则不会成为默认入口 - server_name 设为 _(下划线),这是 Nginx 官方推荐的“无效域名”占位符,不匹配任何真实域名
- return 指令决定响应行为:返回 444(直接断连,最干净)、403(拒绝访问)、或 301 跳转到合法域名
推荐配置:HTTP + HTTPS 全覆盖
如果你已部署 HTTPS,建议同时拦截 HTTP 和 HTTPS 的 IP 请求,避免绕过:
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
return 444;
<pre class="brush:php;toolbar:false;"># 若启用 HTTPS,需提供证书(否则 443 会报错)
ssl_certificate /path/to/your/cert.pem;
ssl_certificate_key /path/to/your/cert.key;}
注意:这段配置必须放在所有其他 server 块之前,确保它优先被选为 default_server。证书路径要替换成你实际的 PEM 和 KEY 文件路径。
替代方案:跳转到主域名(更友好)
如果不想让用户看到空白页或 ERR_EMPTY_RESPONSE,可用 301 跳转引导至正规域名:
server {
listen 80 default_server;
server_name _;
return 301 https://www.yourdomain.com$request_uri;
}这个配置只处理 HTTP 请求;HTTPS 的 IP 访问仍需单独一个 server 块(带 ssl 和 return 444 或 301),否则 https://IP 可能因证书不匹配而报错或降级到 HTTP。
验证与生效关键步骤
改完配置后,不能直接 reload —— 必须先验证语法是否正确:
- 运行
nginx -t,输出 “syntax is ok” 和 “test is successful” 才算通过 - 确认配置文件路径:Ubuntu/Debian 常在
/etc/nginx/sites-enabled/或/etc/nginx/conf.d/;CentOS/RHEL 多在/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf - 执行
sudo nginx -s reload(或sudo systemctl reload nginx)使配置生效 - 测试:用 curl -I http://你的服务器IP 和 https://你的服务器IP,应分别返回 444、403 或 301 状态码


















