需扩展nginx日志格式,添加$status、$request_uri、$upstream_http_location等字段以捕获30x跳转细节;通过awk提取3xx请求并按$request_id聚合还原跳转链路;重点识别高频单ip跳转、重复参数累积、跨域跳转过长等异常模式。

直接通过 Nginx 日志追踪 30x 跳转次数,关键在于捕获跳转行为本身、识别跳转链路、并区分正常与异常模式。默认日志不记录跳转细节,必须主动增强日志字段和分析逻辑。
扩展日志格式,显式记录跳转关键信息
默认 combined 日志无法区分 301/302 响应或跳转目标。需在 http 块中定义专用日志格式:
- 包含
$status—— 用于筛选所有 3xx 响应(如301、302、307) - 添加
$request_uri和$args—— 判断是否含循环参数(如?next=/a&next=/b&next=/c) - 若使用反向代理,加入
$upstream_http_location—— 记录实际跳转地址(如Location: https://example.com/login) - 可选加入
$request_time和$upstream_response_time—— 辅助判断是否因后端延迟引发多次重试跳转
示例配置:
定位单次跳转与跳转链路
一次用户访问可能触发多个连续跳转(如 A → B → C),需从日志中还原路径:
- 用
awk '$9 ~ /^3[0-9]{2}$/ {print $1, $4, $9, $12}' access.log提取所有 3xx 请求的 IP、时间、状态码、跳转地址 - 按
$request_id聚合 —— 若已在请求头透传该 ID,可用它关联同一用户会话下的多次跳转请求 - 检查
$http_referer是否为本站上一跳 URI,再结合$request_uri判断是否形成闭环(如/jump?url=/jump?url=...) - 对高频跳转入口(如
/out、/go)单独统计:提取其响应中Location值,看是否指向自身或短链服务
识别异常跳转模式
不是所有 30x 都有问题,重点识别以下风险特征:
- 高频单 IP 短时跳转:同一 IP 在 1 分钟内产生 ≥5 次 302,大概率是恶意爬虫构造的无限跳转
-
递增/哈希路径跳转:URI 中出现类似
/r/abc123→/r/def456→/r/ghi789的无规律变化,常用于绕过风控 -
重复参数累积:URL 中
redirect=、url=、next=出现多次且值不同,说明前端未清理旧参 -
跨域跳转链过长:单次请求链路中出现 ≥3 次跨域名跳转(可通过
$upstream_http_location提取 host 判断)
辅助验证与快速排查
避免依赖日志回溯,日常可结合命令行快速验证:
- 用
curl -I -L -s http://yoursite.com/path查看真实跳转路径(-L自动跟随,-I只取响应头) - 加
--max-redirs 3限制最大跳转次数,防止卡死;若返回curl: (47) Maximum redirects exceeded,说明存在循环 - 对比浏览器开发者工具 Network 面板中的
Location响应头与 Nginx 日志中$upstream_http_location是否一致,确认日志采集无遗漏











