什么是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:正常输出请求的URLurl_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辅助作者原创,未经许可,转载请保留原文链接。

发表评论