文档首页> 技术教程> 禁止 IP 直接访问站点

禁止 IP 直接访问站点

发布时间:2026-06-30 20:00        更新时间:2026-07-01 16:23
浏览器里输服务器 IP 能直接打开网站,说明 Nginx 把没匹配到任何 server_name 的请求,交给了排在最前面的 server 块,也就是默认站点。这个口子建议关掉。 为什么要禁 IP 直接可访问有几个坏处:扫描器会顺藤摸瓜把 IP 和站点关联起来,日后换 CDN、迁移源站时,历史扫描记录还指着这个 IP;搜索引擎可能同时收录 IP 版和域名版页面,造成重复内容;HTTPS 下用 IP 访问证书也对不上号,浏览器直接报证书错误。收口之后,IP 本身不再暴露站点内容,站点和服务器之间多了一层隔离,建议在站点上线前就完成这一步。 配置默认拒绝 新增一个放在所有 server 块最前面的块: server { listen 80 default_server; server_name _; return 444; } 444 是 Nginx 的约定状态码:不返回任何内容,直接断开连接,比 403 更省流量也少暴露信息。想温和一点,把 return 改成 301 跳到主域也行,但推荐直接断开。机器上还监听了别的端口(比如 8080 的测试站),每个 listen 端口都要有自己的 default_server,漏一个口子就还是开着,用 ss -tlnp 列出所有监听端口逐个核对。 HTTPS 侧同样要收 443 上也需要一个 default_server,否则 IP 的 HTTPS 请求仍会落到某个正常站点。这里有个背景知识:HTTPS 握手时客户端通过 SNI(服务器名称指示)告诉服务器想访问的域名,服务器据此选证书和站点,直接用 IP 访问时没有 SNI,只能落默认块。默认块没有有效证书可配,自签一张即可,反正浏览器会在证书校验这一关就拦下来: openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -subj "/CN=self" -keyout /etc/nginx/ssl/self.key -out /etc/nginx/ssl/self.crt server 块里 ssl_certificate 指向这两个文件,listen 443 ssl default_server。 验证与回源影响 curl -I http://服务器IP 返回空响应或连接被重置,即 80 侧生效;curl -k https://服务器IP 能收到自签证书的响应、正式浏览器访问提示证书不匹配,即 443 侧符合预期。接了 CDN 的站点检查一下回源方式:回源地址填域名的完全不受影响;填 IP 回源的会被拒绝,改回域名回源即可。改动记得先过 nginx -t 再 reload,一处一处来,不要批量改完再验。