一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Linux 如何配置 Nginx 阻止恶意的 User-Agent 抓取

时间:2026-08-07 11:04:47 编辑:袖梨 来源:一聚教程网

Nginx拦截恶意User-Agent需科学配置:用map在http块预定义黑名单并处理空UA,if规则置于server顶层,配合限流、robots.txt及自定义日志。

直接在 Nginx 配置里拦截恶意 User-Agent 是最轻量、见效快的反爬手段,但单靠它容易误杀或漏拦。关键不是“加几行正则”,而是把匹配逻辑、执行位置、兜底策略都配对。

用 map 预定义黑名单,避免重复编译

把 UA 黑名单统一放在 http 块 里,用 map 指令映射为一个变量,既高效又易维护:

  1. 空 UA 和空白字符串必须单独处理:~*^$~*^[[:space:]]*$
  2. 大小写不敏感匹配用 ~*,比如 ~*sqlmap~*(python-requests|urllib)
  3. 常见恶意工具名要列全:nikto、dirbuster、acunetix、SemrushBot、AhrefsBot、Bytespider、ZmEu、MJ12bot 等
  4. 默认值设为 0,命中才设为 1,方便后续 if 判断

if 规则必须写在 server 块顶层

不能塞进 location 里——Nginx 的 if 在 location 内部是“伪生效”,最新明确不推荐嵌套。正确位置是:server { 后、所有 location { 前

  1. 写成 if ($blocked_ua) { return 403; } 即可,简洁可靠
  2. 空 UA 要额外补一条:if ($http_user_agent = "") { return 403; }(正则匹配不到空串)
  3. 如果只拦部分路径(如后台接口),也别把 if 放进 location,而是用变量+条件判断,保持执行顺序可控

配合限流和 robots.txt 才算完整

只封 UA 只能挡住“懒爬虫”,真正耗资源的是高频请求。必须加限流:

  1. 在 http 块定义限流区:limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=5r/s;
  2. 在 server 或 location 中启用:limit_req zone=ip_limit burst=10 nodelay;
  3. robots.txt 要精确匹配:location = /robots.txt,内容按“具体 UA → 泛化 UA”顺序写,末尾加 User-Agent: *Disallow: /

加日志方便排查误拦

拦截后看不到效果?加一条自定义日志格式,专门记录被拦的 UA:

  1. 定义日志格式:log_format blocked_ua '$remote_addr - $remote_user [$time_local] "$request" $status "$http_user_agent"';
  2. 指定日志文件:access_log /var/log/nginx/blocked-ua.log blocked_ua;
  3. 重启前务必 nginx -t 校验,再 nginx -s reload 平滑生效

热门栏目