为什么要逐层查看重定向参数变化?
在做网站运维、UTM流量追踪、短链检测时,经常会遇到一个问题:请求一个URL,最终到达的页面是对的,但中间的参数不知道在哪一层被改掉了。用浏览器看只能看到最终结果,看不到中间过程。curl -I 配合一些参数,可以帮你把每一跳的响应头都抓出来,看清楚每一层重定向时参数有没有被丢弃、被覆盖、还是被追加。
curl -I 基础用法回顾
curl -I URL 发送 HEAD 请求,只拿响应头,不下载响应体。对于重定向场景,重点关注 Location 头——它告诉你下一跳的地址。
# 查看单个请求的响应头
curl -I https://example.com/redirect
# 输出示例:
# HTTP/1.1 301 Moved Permanently
# Location: https://www.example.com/redirect?utm_source=test
# ...
技巧一:curl -L -I 逐层打印所有响应头
单独用 -I 只显示最终响应头,配合 -L(跟随重定向)才能看到每一跳。但默认行为仍然只显示最后一跳的头。正确做法是结合 -v 或利用 --max-redirs 逐层截断来分别查看。
# 方法:限制重定向次数,逐层查看
# 第一跳:不允许重定向
curl -I https://example.com/short-link
# 第二跳:允许1次重定向,看Location变了没有
curl -L --max-redirs 1 -I https://example.com/short-link
# 第三跳:允许2次重定向
curl -L --max-redirs 2 -I https://example.com/short-link
通过逐步增加 --max-redirs 的值,你可以把每一跳的 Location 头单独拿出来比对,看查询参数在哪一跳被改了。
技巧二:curl -v 查看完整请求响应过程
-v(verbose)模式会打印出每次重定向的请求头和响应头,是逐层排查最有效的手段。
curl -L -v https://example.com/redirect 2>&1 | findstr /i "Location HTTP/"
在 PowerShell 中用 Select-String 过滤:
curl -L -v https://example.com/redirect 2>&1 | Select-String "Location", "HTTP/"
输出会清晰地显示每一跳的 HTTP 状态码和 Location 值,参数变化一目了然。
技巧三:curl -I 配合 -H 保留原始请求头
有些重定向逻辑依赖请求头(如 Host、User-Agent、Referer),用 -H 可以模拟真实场景,看参数在不同请求头下的跳转行为。
# 模拟带Referer的请求,看重定向参数是否保留
curl -I -H "Referer: https://google.com" "https://example.com/redirect?utm_source=google"
# 模拟移动端UA
curl -I -H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 15_0)" ^
"https://example.com/redirect?utm_campaign=spring"
技巧四:用 curl -w 输出重定向变量,量化跳转次数和最终URL
-I 看头,-w 看数据。两者配合才能完整诊断重定向链路。
# 同时获取跳转次数和最终URL
curl -L -s -o NUL -w "跳转次数: %{num_redirects}\n最终URL: %{url_effective}\n" ^
"https://example.com/redirect?utm_source=test"
如果 num_redirects 大于0但 url_effective 里的参数跟原始请求不一致,说明参数在某一跳被丢弃了,此时再用技巧二的 -v 方法逐层定位。
技巧五:Shell 脚本逐层提取 Location 头,自动化参数对比
手动逐层看太慢,用脚本可以把每一跳的 URL 都存下来,自动对比参数变化。
Linux Bash 版本:
#!/bin/bash
URL="https://example.com/short-link"
for i in 0 1 2 3 4 5; do
echo "=== 第 $i 跳 ==="
LOCATION=$(curl -s --max-redirs $i -I "$URL" | grep -i "^Location:" | tail -1)
echo "$LOCATION"
if [ -z "$LOCATION" ]; then
echo "不再重定向,结束"
break
fi
URL=$(echo "$LOCATION" | sed 's/Location: //i' | tr -d '\r')
done
Windows PowerShell 版本:
$url = "https://example.com/short-link"
for ($i=0; $i -le 5; $i++) {
Write-Host "=== 第 $i 跳 ==="
$resp = curl -s --max-redirs $i -I $url
$location = ($resp | Select-String "Location:").ToString()
Write-Host $location
if (-not $location) { break }
$url = ($location -split "Location: ")[1].Trim()
}
实战案例:短链UTM参数在哪一层丢了?
假设你有一个短链 https://t.co/abc123?utm_source=twitter,最终到达落地页时 utm_source 变成了 direct。排查步骤:
- 先用
curl -I看第一跳 Location,参数还在不在 - 用
curl -L -v看完整链路,找到参数消失的那一跳 - 检查该跳的 Nginx/Cloudflare 配置,是否是
return 301没带$is_args$args - 用
curl -w "%{url_effective}"确认最终URL的参数值
绝大多数情况下,问题出在 Nginx 的 return 301 https://example.com$uri 这种写法——它只保留了路径,没保留查询参数。改成 return 301 https://example.com$request_uri 即可。
相关文章
- URL重定向时UTM参数丢失排查:7个步骤快速定位流量追踪失效原因
- curl -I查看HTTP响应头详解:5个实战技巧让你快速诊断网站状态
- curl -w num_redirects配合url_effective追踪完整跳转链路:3个实战场景彻底搞定
总结
逐层查看重定向参数变化,核心就是四个工具的组合:-I 看响应头、-v 看完整过程、--max-redirs 逐层截断、-w 量化跳转数据。掌握这五个技巧,重定向链路里的参数丢失问题基本都能定位到根因。
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论