0

curl -w num_redirects配合url_effective追踪完整跳转链路:3个实战场景彻底搞定

2026.06.02 | youres | 32次围观

num_redirects 和 url_effective 各自是干什么的?

先把两个变量搞清楚,不然后面用起来总感觉迷迷糊糊。

num_redirects:跳转了几次

这个变量告诉你:这次请求一共经历了几次重定向。注意是"次数",不是"层数"。举个例子:

  • A → B → C,num_redirects = 2(两次跳转,最终到达C)
  • A → A → A → A,num_redirects = 3(三次跳转,哪怕是在循环)

值为 0 表示没有发生重定向,你拿到的就是原始请求的响应。

url_effective:最终落在了哪个URL

这个变量给出的是:经过所有重定向之后,实际产生响应的那个URL。它解决的是"我最终到了哪里"的问题。

这两个变量配合起来用,一个回答"跳了几次",一个回答"最后在哪里",正好是完整跳转链路诊断的两个核心问题。

基础用法:一行命令看清跳转次数和最终URL

最简单的用法,直接在两个变量之间加个分隔符输出:

curl -L -w "\n跳转次数: %{num_redirects}\n最终URL: %{url_effective}\n" -o /dev/null -s https://example.com

参数说明:

  • -L:跟随重定向,不加这个 num_redirects 永远是 0
  • -w:请求完成后输出格式化信息
  • -o /dev/null:不显示响应体,只要跳转信息
  • -s:静默模式,不显示进度条

Windows PowerShell 用户注意:/dev/null 要改成 NUL,或者用 -o NUL

实战场景一:短链参数丢失诊断

这是最常见的问题场景。你发了一个带 UTM 参数的短链,用户点击后 GA4 里显示 direct,说明参数在跳转过程中丢了。

用 num_redirects + url_effective 可以这样排查:

curl -L -w "\n=== 跳转诊断 ===\n跳转次数: %{num_redirects}\n最终URL: %{url_effective}\n最终状态码: %{http_code}\n" -o NUL -s "https://your-short.link/abc?utm_source=wechat&utm_medium=social"

重点看最终URL里还有没有 utm_sourceutm_medium 参数。如果最终URL里参数消失了,说明重定向过程中没有保留查询字符串,需要去检查 Nginx/Cloudflare 的重定向配置。

实战场景二:CDN/多层代理跳转链路追踪

网站前面有 CDN(Cloudflare、阿里云CDN 等),后面有 Nginx,再后面有后端应用。一层层跳转,参数在哪一层丢的?

配合 -v 参数可以看到每一次跳转的响应头:

curl -L -v -w "\n跳转次数: %{num_redirects}\n最终URL: %{url_effective}\n" -o NUL "https://youres.cn/test?utm_campaign=summer" 2>&1 | findstr /i "Location:"

Windows 下用 findstr 过滤 Location 头,能看到每一次跳转的目标地址。结合最终URL,就能判断参数是在哪一层丢失的。

实战场景三:用 @ 模板文件做批量跳转巡检

如果你要监控多个域名的跳转行为(比如确认 HTTPS 跳转后参数是否保留),用 -w @模板文件 的方式最高效。

先创建一个模板文件 redirect_check.txt

URL: %{url_effective}
跳转次数: %{num_redirects}
最终状态码: %{http_code}
总时间: %{time_total}s

然后批量检测:

for url in "https://domain1.com?utm=test" "https://domain2.com?utm=test"; do
  curl -L -w "@redirect_check.txt" -o /dev/null -s "$url"
  echo "---"
done

PowerShell 版本:

$urls = @("https://domain1.com?utm=test","https://domain2.com?utm=test")
foreach ($url in $urls) {
    curl -L -w "`n跳转次数: %{num_redirects}`n最终URL: %{url_effective}`n" -o NUL -s $url
    Write-Output "---"
}

常见问题:num_redirects 输出 0 但明明发生了跳转?

这是新手最容易踩的坑。原因只有一个:-L 参数没加。

num_redirects 统计的是 curl 实际跟随的重定向次数。如果你没有加 -L,curl 遇到 301/302 不会跟随,num_redirects 自然是 0。

另一个可能:某些网站的重定向是通过 JavaScript 或 Meta Refresh 实现的,curl 的 -L 只能处理 HTTP 301/302/303/307/308 重定向,对 JS 跳转无能为力。遇到这种情况,最终URL会和原始URL一样,num_redirects 也是 0。

进阶组合:同时输出跳转耗时

跳转次数和最终URL搞清楚之后,还有一个问题:跳转慢不慢?

配合 time_redirect 变量(注意:这个变量需要较新版本的 curl):

curl -L -w "\n跳转次数: %{num_redirects}\n最终URL: %{url_effective}\n重定向耗时: %{time_redirect}s\n总耗时: %{time_total}s\n" -o NUL -s https://example.com

如果 time_redirect 在你的 curl 版本里不可用(老版本会报错),可以改用 time_total 对比加 -L 和不加 -L 的耗时差异,间接判断重定向的性能影响。

相关文章

版权声明

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

发表评论