0

curl url_redirect单独使用场景分析:5个实战命令让你看透服务器的跳转意图

2026.06.03 | youres | 21次围观

什么是url_redirect变量?

curl的--write-out-w)参数内置了两个与重定向相关的输出变量:

  • url_effective:输出最终实际请求到的URL地址,即整个请求链路结束后浏览器地址栏显示的那个URL
  • url_redirect:输出的是Location响应头中的URL,也就是服务器告诉你"应该跳转到哪里"的那个地址

乍一看差不多,但两者之间存在关键差异。理解这些差异,能让你在排查重定向问题时精准定位问题环节。

url_redirect vs url_effective:核心区别

区别一:输出时机不同

url_effective在整个传输完成后输出最终地址;url_redirect则记录的是最后一次Location头中看到的URL。当你使用了-L参数跟随重定向时,url_redirect记录的是跳转的目标地址,而url_effective记录的是跟随跳转后最终到达的地址。

如果只有一次重定向,两者输出完全一样。但如果存在多次重定向(A→B→C),url_effective输出的是C,url_redirect输出的也是C(最后一次Location头),但中间经过B的过程两者都看不到。

区别二:不跟随重定向时的行为

不使用-L参数时,curl拿到302响应后不会继续请求。此时:

  • url_effective:仍然是你最初请求的那个URL(因为没有跟随跳转,最终URL就是原始URL)
  • url_redirect:输出的是Location头里的目标地址(即服务器让你跳转去的地方)

这个差异非常实用——你想知道"服务器想让我跳去哪"但不关心跳转后的结果时,url_redirect更直观。

区别三:没有重定向时的输出

当请求的URL没有任何重定向(直接200响应)时:

  • url_effective:正常输出请求的URL
  • url_redirect:输出为空

利用这个特性,你可以快速判断一个URL是否发生了重定向。

5个实战场景:url_redirect的独立使用

场景一:不跟随重定向,快速查看跳转目标

curl -s -o /dev/null -w "%{url_redirect}" https://short.link/abc

不使用-L,curl在收到重定向响应后直接结束。url_redirect输出Location头中的地址,告诉你短链指向哪里。这比url_effective更直观——因为你根本没去请求跳转后的地址,url_effective返回的还是原始短链。

场景二:检查重定向是否存在

result=$(curl -s -o /dev/null -w "%{url_redirect}" https://example.com/page)
if [ -z "$result" ]; then
    echo "无重定向,页面直接可达"
else
    echo "存在重定向,跳转目标:$result"
fi

利用url_redirect在无重定向时为空的特性,一行判断URL是否触发了跳转。

场景三:对比原始URL和跳转目标,检查UTM参数

curl -s -o /dev/null -w "原始URL: %{url_effective}\n跳转目标: %{url_redirect}\n" \
  "https://marketing.site/link?utm_source=wechat&utm_medium=share"

对比两个输出,能立即判断UTM参数是否在跳转过程中被保留。如果url_redirect中的UTM参数消失了,说明服务器或CDN在跳转时剥离了查询参数。

场景四:批量检测短链是否有效

while read url; do
  target=$(curl -s -o /dev/null -w "%{url_redirect}" "$url")
  if [ -z "$target" ]; then
    echo "[失效] $url"
  else
    echo "[有效] $url -> $target"
  fi
done < urls.txt

批量检测短链存活状态,url_redirect为空说明链接没有跳转响应(可能已失效或返回200死链页面)。

场景五:配合-s和-o /dev/null实现静默检测

curl -s -o /dev/null -w "%{http_code} %{url_redirect}\n" https://example.com

同时输出状态码和跳转目标,一行命令获取两个关键信息。适合写在Shell脚本中做自动化巡检。

什么时候该用url_redirect,什么时候用url_effective?

用url_redirect的场景

  • 想看服务器Location头返回的原始跳转地址
  • 不使用-L时需要知道"跳去哪"
  • 判断URL是否触发了重定向(空=无重定向)
  • 只需关心第一次跳转的目标

用url_effective的场景

  • 需要知道最终到达的URL(跟随所有跳转后)
  • 检测UTM参数是否在整条跳转链路中保留
  • 配合-L追踪完整跳转链路
  • 排查多次重定向后的最终着陆页

两者配合使用的场景

curl -s -L -o /dev/null -w "url_effective: %{url_effective}\nurl_redirect: %{url_redirect}\nnum_redirects: %{num_redirects}\n" https://example.com

同时输出三个变量,一次请求获取跳转次数、跳转目标和最终URL的完整信息。

常见问题

url_redirect输出为空怎么办?

最常见的原因有两个:一是该URL本身没有触发重定向(正常200响应);二是你使用了-L参数,curl跟随了跳转,url_redirect记录的是最后一次跳转的目标——如果最后一次响应是200而非3xx,url_redirect就是空的。

解决方法:如果只想看跳转目标,不要加-L

Windows PowerShell中使用url_redirect

PowerShell中%是特殊字符,需要转义:

curl.exe -s -o NUL -w "%%{url_redirect}" https://example.com

注意用curl.exe而不是Invoke-WebRequest,因为-w是curl原生参数。

url_redirect能显示所有跳转中间环节吗?

不能。url_redirect只记录最后一次Location头。要查看完整跳转链路,需要配合-v参数:

curl -s -v https://example.com 2>&1 | grep -i "location:"

总结

url_redirect是一个常被忽略但非常实用的curl变量。它和url_effective的区别不在于"功能强弱",而在于"视角不同"——一个看的是服务器的跳转意图,一个看的是最终着陆地址。选对变量,排查重定向问题的效率能提升一大截。

相关文章

版权声明

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

发表评论