Nginx拦截恶意User-Agent需科学配置:用map在http块预定义黑名单并处理空UA,if规则置于server顶层,配合限流、robots.txt及自定义日志。
直接在 Nginx 配置里拦截恶意 User-Agent 是最轻量、见效快的反爬手段,但单靠它容易误杀或漏拦。关键不是“加几行正则”,而是把匹配逻辑、执行位置、兜底策略都配对。
把 UA 黑名单统一放在 http 块 里,用 map 指令映射为一个变量,既高效又易维护:
~*^$ 和 ~*^[[:space:]]*$
~*,比如 ~*sqlmap、~*(python-requests|urllib)
不能塞进 location 里——Nginx 的 if 在 location 内部是“伪生效”,最新明确不推荐嵌套。正确位置是:server { 后、所有 location { 前:
if ($blocked_ua) { return 403; } 即可,简洁可靠if ($http_user_agent = "") { return 403; }(正则匹配不到空串)只封 UA 只能挡住“懒爬虫”,真正耗资源的是高频请求。必须加限流:
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=5r/s;
limit_req zone=ip_limit burst=10 nodelay;
location = /robots.txt,内容按“具体 UA → 泛化 UA”顺序写,末尾加 User-Agent: * 和 Disallow: /
拦截后看不到效果?加一条自定义日志格式,专门记录被拦的 UA:
log_format blocked_ua '$remote_addr - $remote_user [$time_local] "$request" $status "$http_user_agent"';
access_log /var/log/nginx/blocked-ua.log blocked_ua;
nginx -t 校验,再 nginx -s reload 平滑生效