在 nginx 中通过 map + if 指令精准匹配并拦截恶意 user-agent 是最轻量高效的反爬手段,支持忽略大小写正则匹配、空 ua 和扫描工具 ua,并可结合日志记录与 444 断连增强防护。

直接在 Nginx 配置中拦截恶意 User-Agent 是最轻量、高效的反爬手段之一,无需额外组件,关键在于精准匹配和合理策略。
识别常见恶意 User-Agent 字符串
先确认你要拦截的爬虫特征。典型恶意 UA 包括:
-
明显伪造的 UA:如
sqlmap、nikto、dirbuster、acunetix -
无意义或异常 UA:空字符串、纯数字、过短(如
123)、含非法字符(如\x00) -
已知扫描工具 UA:如
Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)(老旧且可疑) -
高频恶意爬虫 UA:如
SemrushBot、AhrefsBot(若你未授权其抓取)
在 server 或 http 块中配置 map + if 规则
推荐用 map 指令预定义黑名单,再用 if 拦截,避免重复正则编译:
# 在 http 块中定义
map $http_user_agent $blocked_ua {
default 0;
~*sqlmap 1;
~*nikto 1;
~*dirbuster 1;
~*acunetix 1;
~*wget 1;
~*curl 1;
~*(python-requests|urllib|httpie) 1;
~*SemrushBot 1;
~*AhrefsBot 1;
~*^$ 1; # 空 UA
~*^[[:space:]]*$ 1; # 全空白
}
然后在 server 块中拦截:
if ($blocked_ua) {
return 403;
}
注意:if 在 location 中慎用,但用于 UA 过滤且只做 return 是安全的。
增强防护:结合日志与渐进式响应
单纯 403 可能暴露过滤逻辑,建议:
- 记录被拦截的 UA 到独立日志,便于分析:
access_log /var/log/nginx/blocked-ua.log main if=$blocked_ua; - 对高频恶意 UA 可返回 444(Nginx 特有,直接断连,不发响应头)
- 对疑似扫描行为(如大量 404 + 异常 UA),可配合
limit_req限速
注意事项与避坑点
User-Agent 容易伪造,不能作为唯一防线,但作为第一道过滤很有效:
-
大小写敏感:正则加
~*表示忽略大小写 - 不要过度拦截:避免误杀合法爬虫(如 Googlebot),可加白名单机制
- 移动端 UA 易误判:某些手机 UA 含 “curl” 或 “Python”,需排除真实客户端
-
重启或重载生效:
nginx -t && nginx -s reload











