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 访问不受影响。
常见坑
- 正则太宽泛,把正常 App 的 UA 也匹配进去,误伤用户。
- 只在 location 写 if,其他 location 没覆盖,爬虫换路径绕过。
- 恶意 UA 可伪造,UA 拦截只能挡低阶爬虫,不能替代频控。
- 大小写匹配用 ~* 忽略大小写,避免漏封。
- 搜索引擎爬虫被封导致收录下降,务必放行官方 UA。
- map 写在 server 内无效,必须放在 http 层。
- 大量拦截规则影响匹配性能,控制规则数量。
总结
UA 拦截靠 map 给恶意 UA 打标记,再用 if 返回 403,放 server 或对应 location。规则要精准、放行正规搜索爬虫,并用 curl 换 UA 测试。它是辅助手段,真正的高频恶意访问还要配合 limit_req 限流和 IP 封禁。
遇到问题加QQ23979811 协助处理
标签: Nginx 安全 User-Agent 爬虫