最近到后台看了下访客记录,来源url不少是通过IP地址直接访问的,简洁好记的域名不用,也是服了互联网上的老六。不过有一说一,普通用户肯定是不会去这样做的,这些通过IP访问的估计不少是采集机器或者IT同行,那今天就有必要想办法来限制一下了。
P1.通过IP地址直接访问网站
简单了解了一下,通过IP地址直接访问网站问题不少。一是容易干扰搜索引擎收录工作,分散权重;二是没做备案的域名或者干脆进入黑名单的域名可以恶意解析到网站服务器,最后倒霉悲催的服务器IP地址被封禁;三是绝大部分的采集机器、广告机器都是通过IP地址工作的,辛辛苦苦几个月写的一点东西被人家几秒钟采集光了,还得应付没完没了的广告评论。
网络上通过NGINX配置禁止IP地址直接访问网站的资料不少,比如新增一个server,代码如下:
server{
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 403;
}
试了下,效果不太好。现有nginx server下的80和443端口已配置不少过滤项,要调整的东西太多了。那如何在不进行大改动的前提下,实现禁止通过IP地址直接访问网站呢?在server_name下一行增加一个if过滤,80监听端口去掉default_server。
if ($host !~* "leicong.net"){
return 403;
}
P2.添加浏览器请求头host过滤
说明:对浏览器请求头host进行判断,如果不包含"leicong.net"域名字符串,则直接扔个403回去。
浏览器测试一下,通过IP地址已经无法访问网站了,完工。
P3.IP地址+80或者443端口均无法访问网站
附:nginx location匹配命令说明
- ~ #波浪线表示执行一个正则匹配,区分大小写
- ~* #表示执行一个正则匹配,不区分大小写
- ^~ #^~表示普通字符匹配,不是正则匹配。如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
- = #进行普通字符精确匹配
- @ #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files