问题描述
我们的一些站点可以通过 IP 地址直接访问,虽然没有安全问题,但是通过 IP 地址直接访问,却会带来其他问题。比如,在 SEO 中,开启 IP 访问,如果有其他域名解析到我们的主机上,那对方的域名也是可以打开的,这样百度上就会出现两个一模一样的网站,就会被认为是垃圾站,一起被降权。
因此,我们希望禁止禁止这种形式的访问,并且“禁止”的含义为不做任何响应,就好像我们并不存在。
该笔记将记录:在 Nginx 中,如何禁止通过 IP 地址访问的请求,以及常见问题的处理。
解决方法
方法一、返回 404 或者重定向
在多数情况下,我们可以返回 404 或者重定向到我们的主域名:
server { listen 80 default_server; server_name ""; # 不重要 return 404; } server { listen 80; server_name IP_ADDRESS; return 301 http://YOUR.DOMAIN; }
default_server:表示该 server 为默认 server(用于处理通过 IP 地址访问的请求,以及那些没有绑定的域名)。如果没有 server {} 使用 default_server 指令,则使用首个 server 配置。
方法二、完全不响应请求
server { listen 80 default_server; server_name _; # 不重要 return 444; }
return 444:该响应码表示不响应请求,并立即关闭连接。
通过 curl 测试,将返回 curl: (52) Empty reply from server 信息。
参考文献
Module ngx_http_core_module / listen
Nginx / Server names
Blocking IPs with Nginx – DreamHost Knowledge Base
How to block access using the Server IP in NGINX? | DigitalOcean
nginx – how to disable direct access to a web site by ip address – Stack Overflow