目录
- 为什么要逐层看Location头?
- 方法一:curl -v -L 最直接(推荐)
- 方法二:--max-redirs 逐层截断法
- 方法三:curl -I 配合 grep 提取Location
- 方法四:用 -w 变量输出跳转次数和最终URL
- 方法五:Shell脚本自动逐层追踪完整链路
- PowerShell 适配注意事项
- 实战案例:短链UTM参数追踪
为什么要逐层看Location头?
排查短链参数丢失、UTM归因失效、CDN跳转异常时,只看到最终URL远远不够。你需要知道每一跳的Location头里参数是什么时候丢的——是第一跳就被剥离,还是中间某层CDN干掉的。
逐层查看Location头能帮你精准定位问题发生在哪一层,而不是瞎猜。
方法一:curl -v -L 最直接(推荐)
curl -v -L URL 是最直接的方式。-v 开启详细模式,-L 跟随重定向,每一跳的请求和响应头都会打印出来。
curl -v -L "https://short.url/abc?utm_source=wechat" 2>&1 | grep -i "Location:"
输出示例:
< Location: https://mid.domain.com/xyz?utm_source=wechat
< Location: https://final.site.com/landing?utm_source=wechat&utm_medium=social
每一行 < Location: 就是一跳的响应头,参数变化一目了然。注意 2>&1 把stderr合并到stdout,这样grep才能抓到。
方法二:--max-redirs 逐层截断法
想看第N跳的Location头,可以用 --max-redirs N 限制跳转次数,逐层截断:
# 只看第一跳
curl -I -L --max-redirs 0 "https://short.url/abc?utm_source=wechat" 2>&1 | grep -i location
# 看前两跳(允许跳一次)
curl -I -L --max-redirs 1 "https://short.url/abc?utm_source=wechat" 2>&1 | grep -i location
当 --max-redirs 0 时,curl不跟随重定向,直接返回第一跳的301/302响应头,Location头完整显示。然后手动用Location的值继续请求,逐层排查。
这个方法适合需要交互式逐层分析的场景,比如确认某一跳是否篡改了参数。
方法三:curl -I 配合 grep 提取Location
curl -I 只请求响应头(HEAD请求),不下载内容,速度快。配合 -L 可以看每跳的Location:
curl -I -L "https://short.url/abc" 2>&1 | grep -i location
注意:-I 会把请求方法改为HEAD。有些服务器对HEAD和GET返回的重定向行为不一致,这时候要加 -X GET 强制用GET方法:
curl -I -X GET -L "https://short.url/abc" 2>&1 | grep -i location
方法四:用 -w 变量输出跳转次数和最终URL
如果你只需要知道跳了几次和最终到了哪里,不需要每跳细节,用 -w 变量更高效:
curl -s -o /dev/null -w "跳转次数: %{num_redirects}\n最终URL: %{url_effective}\n" -L "https://short.url/abc"
Windows PowerShell 写法:
$out = curl -s -w "`n跳转次数: %{num_redirects}`n最终URL: %{url_effective}`n" -L "https://short.url/abc" -o nul
$out
这个方法适合批量巡检,性能好,输出结构化,方便后续解析。
方法五:Shell脚本自动逐层追踪完整链路
把逐层追踪封装成脚本,自动打印每一跳的URL和Location头:
#!/bin/bash
URL="$1"
MAX_HOPS=10
for i in $(seq 1 $MAX_HOPS); do
echo "=== 第 $i 跳 ==="
LOCATION=$(curl -s -I -L --max-redirs $((i-1)) "$URL" 2>&1 | grep -i "^Location:" | tail -1)
if [ -z "$LOCATION" ]; then
echo "无更多重定向,结束。"
break
fi
echo "$LOCATION"
# 提取下一跳URL继续
URL=$(echo "$LOCATION" | sed 's/Location: //i' | tr -d '\r')
done
这个脚本的核心思路是:用 --max-redirs $((i-1)) 控制只跳 i-1 次,然后看响应头里的Location,逐层推进。
PowerShell 适配注意事项
Windows上用PowerShell的curl(实际上是Invoke-WebRequest的别名)和Linux curl行为不同。要用真正的curl:
# 确认是curl.exe而不是Invoke-WebRequest别名
curl.exe -v -L "https://short.url/abc" 2>&1 | Select-String "Location"
PowerShell 中 2>&1 也适用,但更推荐用 Select-String 替代 grep:
curl.exe -v -L "https://short.url/abc" 2>&1 | Select-String "Location"
实战案例:短链UTM参数追踪
假设你发现某个营销短链的UTM参数在GA4里显示不出来,用上面的方法逐层检查:
curl -v -L "https://your-brand.link/summer-sale?utm_source=wechat&utm_medium=social&utm_campaign=2026summer" 2>&1 | Select-String "Location"
如果第一跳Location里还有UTM参数,第二跳没了,问题就在第二跳的服务器或CDN配置上。精准定位,不靠猜。
总结
- curl -v -L:最直观,能看到每一跳的完整请求响应细节
- --max-redirs N:逐层截断,精确控制跟跳层数
- curl -I -L:只看头,速度快,适合批量
- curl -w 变量:结构化输出跳转次数和最终URL,适合脚本化
- Shell/PowerShell脚本:自动化逐层追踪,可集成到监控
排查重定向参数丢失,先逐层看Location头,找到参数消失的那一跳,再去对应层(CDN、Nginx、后端)修配置,效率最高。
相关文章
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论