可通过Nginx日志与内置变量高效识别恶意爬虫引发的高频重定向,需自定义日志格式记录$status、$request_uri等字段,结合map模块标记可疑行为,再用limit_req限频、valid_referers验证及动态封禁实现主动防护。

直接通过 Nginx 的日志和内置变量,可以高效识别由恶意爬虫触发的高频重定向(如 301/302 跳转链),而无需额外部署代理或第三方服务。
启用并解析重定向相关日志字段
Nginx 默认日志不记录跳转目标与跳转次数,需显式添加 $status、$request_uri、$upstream_http_location(若为反向代理)及自定义计数变量。推荐在 http 块中定义如下日志格式:
log_format redirect_log
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$request_uri" "$upstream_http_location" $request_length';
关键点:
• $status 可筛选出所有 3xx 响应;
• $upstream_http_location 记录实际跳转地址(仅限 proxy_pass 场景);
• 若使用 rewrite + return 302,需配合 $args 和 $uri 判断是否构造了循环参数(如 ?ref=1&ref=2&ref=3...)。
用 map 模块标记可疑跳转行为
利用 map 在请求阶段实时标记高风险行为,例如同一 IP 短时间内多次触发 302,或 URI 中出现重复跳转参数:
map $remote_addr $redirect_count {
default 0;
# 可结合 geoip 或 limit_req_zone 进一步约束
}
更实用的做法是捕获“跳转链特征”:
• 检查 $args 是否含多个相同参数名(如 next=、url=、redirect= 连续出现);
• 使用正则匹配 URI 是否含递增/哈希混淆路径(如 /go/abc123 → /go/def456 → /go/ghi789);
• 对返回 3xx 的请求,记录其 $request_id 并关联后续请求(需开启 log_by_lua_block 或用外部日志聚合)。
限制重定向频次并阻断异常链路
单纯日志分析只能事后排查,必须叠加主动防护:
- 用
limit_req限制单个 IP 单位时间内的 3xx 响应数量(注意:要作用在产生 3xx 的 location 块,而非全局); - 对已知跳转入口(如
/jump、/out)启用valid_referers或 token 验证,拒绝无来源或过期签名的请求; - 当检测到连续 3 次以上跳转(可通过 upstream response header 注入 X-Redirect-Count,或前端 JS 上报跳转深度),返回 403 或静默丢弃;
- 将高频重定向 IP 自动写入
deny列表(需配合 Lua 或外部脚本实现动态封禁)。
辅助验证:用 curl 模拟并观察跳转链
手动验证时避免浏览器缓存干扰,使用纯净命令:
curl -I -L -s -w "%{redirect_url}\n" "https://yoursite.com/bad-redirect?u=a&u=b&u=c"
关注:
• 实际跳转次数(-L 最多默认 50 次,可加 --max-redirs 5 限制);
• 每次响应头中的 Location 是否递归构造;
• 返回状态码是否在 301/302/307 间混用(恶意跳转常故意切换以绕过客户端限制)。
不复杂但容易忽略。


















