推荐用 map 指令在 http 块预匹配恶意 User-Agent 并赋值 $bad_bot,再于 location 中用 if($bad_bot) return 403 安全拦截;辅以路径正则匹配、限速及日志分析提升防护效果。

在 Nginx 中,可以通过 location 块结合 if、map 或 return 指令识别并拦截恶意爬虫请求,但要注意:直接在 location 中滥用 if 可能引发意外行为,推荐优先使用 map + deny 或 return 403 的组合方式,既高效又安全。
用 map 提前匹配 User-Agent 并标记恶意爬虫
这是最推荐的做法。Nginx 的 map 指令在 server 上下文预处理变量,性能高、逻辑清晰,且规避了 if 的坑。
在 http 块中添加:
map $http_user_agent $bad_bot {
default 0;
"~*python-requests" 1;
"~*curl/7\." 1;
"~*scanner" 1;
"~*sqlmap" 1;
"~*nuclei" 1;
"~*goby" 1;
"~*masscan" 1;
"~*acunetix" 1;
"~*nessus" 1;
}然后在 server 或 location 中拒绝:
location / {
if ($bad_bot) {
return 403;
}
# 正常代理或静态服务
try_files $uri @backend;
}注意:if 在这里仅用于简单判断(非重写),配合 return 是安全的;若需更严格控制,也可用 deny all; 配合 allow 白名单,但需启用 ngx_http_access_module(默认已编译)。
针对特定路径做精准拦截(如 API 接口)
恶意爬虫常高频扫描 /api/、/wp-admin/、/admin/ 等敏感路径,可在对应 location 中叠加 UA 和请求频率双重限制。
- 先用
map标记 UA,再在location /api/内检查$bad_bot - 搭配限速模块防止暴力探测:
limit_req zone=api_burst burst=5 nodelay; - 拒绝时返回统一提示(可选):
error_page 403 /403.html;
补充:用 location 匹配可疑请求特征
有些爬虫不设 UA,或伪造为 Chrome,但会携带异常请求头、参数或路径特征。这时可结合 location 的正则匹配 + if 判断:
location ~* \.(php|jsp|asp|aspx|cgi|pl|py|rb|sh)$ {
if ($args ~* "(eval\(|base64_decode\(|system\()") {
return 403;
}
if ($request_uri ~* "(\.git|\.svn|\.htaccess|\.env)") {
return 403;
}
# 正常处理...
}这类规则适合防御扫描器探针,但不宜过度依赖——应与 WAF、日志分析协同使用。
验证与维护建议
- 开启 Nginx 访问日志中的
$http_user_agent和$status,定期分析 403 日志确认拦截效果 - 避免硬编码黑名单,可将 UA 规则抽到独立文件,用
include bots.conf;管理 - 对搜索引擎爬虫(Bingbot、Googlebot)保持宽容,可用
geo模块按 IP 段白名单放行 - 上线前务必用
nginx -t检查语法,避免因正则错误导致整站不可用


















