0

curl -w num_redirects检测重定向次数:精准诊断跳转链路的实战指南

2026.06.02 | youres | 32次围观

目录

  1. num_redirects是什么
  2. 基础用法:一条命令查出跳转了几次
  3. 5个实战场景
  4. num_redirects与--max-redirs的区别
  5. 进阶技巧:批量检测+脚本化

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

结合-wurl_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_effectiveredirect_url配合使用可以完整还原跳转链路
  • 配合--max-redirs既能看数据又不怕死循环
  • 写成脚本批量检测,能发现隐藏的重定向问题

相关文章

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论