在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]