0

curl -I 逐层查看重定向参数变化:5个实战技巧彻底搞懂重定向链路

2026.06.04 | youres | 41次围观

为什么要逐层查看重定向参数变化?

在做网站运维、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 保留原始请求头

有些重定向逻辑依赖请求头(如 HostUser-AgentReferer),用 -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。排查步骤:

  1. 先用 curl -I 看第一跳 Location,参数还在不在
  2. curl -L -v 看完整链路,找到参数消失的那一跳
  3. 检查该跳的 Nginx/Cloudflare 配置,是否是 return 301 没带 $is_args$args
  4. curl -w "%{url_effective}" 确认最终URL的参数值

绝大多数情况下,问题出在 Nginx 的 return 301 https://example.com$uri 这种写法——它只保留了路径,没保留查询参数。改成 return 301 https://example.com$request_uri 即可。

相关文章

总结

逐层查看重定向参数变化,核心就是四个工具的组合:-I 看响应头、-v 看完整过程、--max-redirs 逐层截断、-w 量化跳转数据。掌握这五个技巧,重定向链路里的参数丢失问题基本都能定位到根因。

版权声明

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

发表评论