在nginx中限制某些agent的访问
这也是在统计日志中发现的问题,某些垃圾爬虫写得太烂,每天过来重复爬,浪费我很多流量,但是因为它们都用分布式代理来的,靠封IP是没法解决的,只能想别的办法。
用封agent是最简单的,但是没想到试了一下,直接用判断$http_user_agent
变量的方法是不行的,比如这样:
if ($http_user_agent == "test agent") {
return 404;
}
是没有效果的,仍然可以正常访问。
放狗搜了一下才知道,这种操作必须使用map,比如这样,在全局配置里加一段:
map_hash_bucket_size 256;
map $http_user_agent $badagent {
default 0;
"test agent" 1;
}
其中map_hash_bucket_size
是因为默认的值太小,稍微配置几项就不够了,所以这里加大一点。
之后,在相应的server段里加上判断即可生效:
if ($badagent) {
return 404;
}
这样配置完重启nginx,就可以对特定的agent返回404错误了。
推送到[go4pro.org]