«

Nginx按User-Agent拦截恶意爬虫配置

时间:2026-11-14 07:17     作者:emer     分类: Nginx


前言

很多恶意爬虫、扫描器会带着固定或伪造的 User-Agent 疯狂抓取接口、图片,消耗带宽和服务器资源。在 Nginx 层按 User-Agent 直接返回 403,比应用层判断更省资源,也不影响正常浏览器。本文讲解 map 定义黑名单、location 拦截、放行正常 UA、常用恶意 UA 写法,以及误伤规避。

操作步骤

1. 在 http 块用 map 标记恶意 UA

map $http_user_agent $bad_bot {
    default 0;
    ~*curl 1;
    ~*scrapy 1;
    ~*python-requests 1;
    ~*httpclient 1;
    ~*semrushbot 1;
    ~*ahrefsbot 1;
    ~*masscan 1;
}

2. 在 server 或 location 拦截

if ($bad_bot = 1) {
    return 403;
}

3. 只拦截接口或整站

整站拦截放在 server 块;只保护接口放 location:

location /api/ {
    if ($bad_bot = 1) { return 403; }
    proxy_pass http://backend;
}

4. 放行搜索爬虫(可选)

百度、谷歌 UA 正常收录,不要误封:

map $http_user_agent $bad_bot {
    default 0;
    ~*googlebot 0;
    ~*baiduspider 0;
    ~*curl 1;
}

5. 校验并重载

nginx -t
nginx -s reload

6. 用 curl 测试是否被拦

curl -A "curl/7.0" https://域名/ -I

返回 403 即生效,正常浏览器 UA 访问不受影响。

常见坑

  1. 正则太宽泛,把正常 App 的 UA 也匹配进去,误伤用户。
  2. 只在 location 写 if,其他 location 没覆盖,爬虫换路径绕过。
  3. 恶意 UA 可伪造,UA 拦截只能挡低阶爬虫,不能替代频控。
  4. 大小写匹配用 ~* 忽略大小写,避免漏封。
  5. 搜索引擎爬虫被封导致收录下降,务必放行官方 UA。
  6. map 写在 server 内无效,必须放在 http 层。
  7. 大量拦截规则影响匹配性能,控制规则数量。

总结

UA 拦截靠 map 给恶意 UA 打标记,再用 if 返回 403,放 server 或对应 location。规则要精准、放行正规搜索爬虫,并用 curl 换 UA 测试。它是辅助手段,真正的高频恶意访问还要配合 limit_req 限流和 IP 封禁。

遇到问题加QQ23979811 协助处理

标签: Nginx 安全 User-Agent 爬虫