目录
num_redirects是什么
在curl的-w(write-out)参数中,num_redirects是一个内置变量,专门用来统计一次请求中发生的重定向跳转次数。和--max-redirs限制跳转上限不同,num_redirects是事后统计——它告诉你这条链路到底经历了多少次跳转。
这个变量的价值在于:诊断。当你怀疑某个URL跳转链路出了问题(循环跳转、多余跳转、参数丢失),num_redirects能给你一个数字化的证据,而不是靠肉眼数。
基础用法:一条命令查出跳转了几次
最简单的用法:
curl -s -o /dev/null -w "num_redirects: %{num_redirects}\n" -L https://example.com
参数说明:
-s:静默模式,不显示进度条-o /dev/null:丢弃响应体(Windows下用-o NUL),只关心跳转统计-w "num_redirects: %{num_redirects}\n":输出重定向次数-L:跟随重定向(不加的话curl默认不跟随,num_redirects永远是0)
输出示例:
num_redirects: 2
意思是这个URL一共跳转了2次才到达最终页面。
5个实战场景
场景1:检测重定向循环
正常网站跳转次数一般在1-3次之间。如果一个URL返回的num_redirects超过5次,大概率存在重定向循环或者链路过长的问题。
curl -s -o /dev/null -w "num_redirects: %{num_redirects}\n" -L --max-redirs 50 https://example.com
配合--max-redirs设置一个较高的上限,让curl不轻易中断,这样能看到真实的跳转次数。如果输出数字特别大(比如接近50),说明链路有问题。
场景2:HTTP到HTTPS跳转验证
很多网站强制HTTP跳转HTTPS,正常情况下num_redirects应该是1。如果大于1,说明中间还有额外跳转(可能经过CDN、负载均衡等)。
curl -s -o /dev/null -w "num_redirects: %{num_redirects}\n" -L http://example.com
# 对比HTTPS直接访问
curl -s -o /dev/null -w "num_redirects: %{num_redirects}\n" -L https://example.com
如果两个结果都是0,说明HTTPS版没有重定向,而HTTP版可能是1次跳转。
场景3:短链跳转追踪
短链接服务通常只有1次重定向。如果num_redirects为2或更多,说明短链跳转到了一个中间页,再跳到最终页面。
curl -s -o /dev/null -w "num_redirects: %{num_redirects}\n" -L https://bit.ly/xxxxx
结合-w的url_effective变量,可以同时获取最终URL:
curl -s -o /dev/null -w "跳转次数: %{num_redirects}\n最终URL: %{url_effective}\n" -L https://bit.ly/xxxxx
场景4:排查UTM参数在跳转中是否丢失
当UTM参数在多次跳转中被剥离,num_redirects能帮你确认跳转的层数。跳转层数越多,参数丢失的概率越高。
curl -s -o /dev/null -w "跳转次数: %{num_redirects}\n" -L "https://example.com?utm_source=baidu&utm_medium=cpc"
如果跳转次数超过3次,就需要逐层检查每跳的Location头,确认参数是否逐层传递。
场景5:对比有无CDN的跳转差异
给同一个域名,分别直连源站和通过CDN访问,对比num_redirects的差异:
# 直连源站
curl -s -o /dev/null -w "直连: num_redirects=%{num_redirects}\n" -L --resolve example.com:443:1.2.3.4 https://example.com
# 通过CDN
curl -s -o /dev/null -w "CDN: num_redirects=%{num_redirects}\n" -L https://example.com
如果CDN版多了跳转,说明CDN层在增加额外的重定向。
num_redirects与--max-redirs的区别
很多人容易混淆这两个概念,这里做个清晰对比:
| 对比项 | num_redirects | --max-redirs |
|---|---|---|
| 作用 | 统计跳转次数(只读) | 限制跳转上限(控制) |
| 时机 | 请求完成后输出 | 请求过程中生效 |
| 默认值 | 无默认值,需通过-w输出 | 默认30次 |
| 超限行为 | 无(只是显示数字) | curl报错退出 |
| 用途 | 诊断、分析 | 防止无限循环 |
简单说:--max-redirs是安全阀,num_redirects是体检报告。两个配合使用效果最好。
进阶技巧:批量检测+脚本化
批量检测多个URL的跳转次数
#!/bin/bash
for url in $(cat urls.txt); do
redirects=$(curl -s -o /dev/null -w "%{num_redirects}" -L --max-redirs 20 "$url")
echo "$url -> 跳转${redirects}次"
done
PowerShell版本
$urls = Get-Content "urls.txt"
foreach ($url in $urls) {
$result = curl.exe -s -o NUL -w "%{num_redirects}" -L --max-redirs 20 $url
Write-Output "$url -> $result"
}
设置跳转次数告警阈值
跳转次数超过5次就标记为异常:
#!/bin/bash
THRESHOLD=5
while read -r url; do
num=$(curl -s -o /dev/null -w "%{num_redirects}" -L --max-redirs 20 "$url")
if [ "$num" -gt "$THRESHOLD" ]; then
echo "[异常] $url 跳转${num}次,超过阈值${THRESHOLD}"
else
echo "[正常] $url 跳转${num}次"
fi
done < urls.txt
总结
curl -w num_redirects是一个简单但非常实用的诊断工具。几个要点:
- 配合
-L才有意义,否则curl不跟随重定向 - 正常网站跳转1-3次,超过5次要警惕
- 和
url_effective、redirect_url配合使用可以完整还原跳转链路 - 配合
--max-redirs既能看数据又不怕死循环 - 写成脚本批量检测,能发现隐藏的重定向问题
相关文章
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论