0

curl测试重定向参数是否保留:5个实战命令让查询字符串丢失无处遁形

2026.06.03 | youres | 26次围观

为什么要用curl测试重定向参数

网站做重定向(301/302/307/308)的时候,查询参数丢失是个高频问题。UTM参数丢了,Google Analytics归因就乱套;分页参数丢了,用户翻页就回到第一页。这些问题往往不是代码逻辑写的,而是重定向配置没注意参数的保留行为。

排查这种问题,最直接的办法就是用curl模拟浏览器请求,观察每一步重定向后URL的变化。本文介绍5个实战命令,覆盖从单次检测到批量排查的完整场景。

命令一:用curl -v追踪重定向Location头

最基础的方法就是加-v参数,curl会在输出中显示服务器返回的完整响应头,包括Location字段。

curl -v "https://example.com/page?utm_source=google&utm_medium=cpc" 2>&1 | grep -i location

这个命令只关注Location头,能看到服务器打算把浏览器跳转到哪里。如果Location头里的URL丢失了查询参数,那参数就是在这个环节丢的。

适用场景:快速确认单次重定向的目标URL是否包含原始参数。

命令二:用curl -L跟随重定向后检查最终URL

-L参数后,curl会自动跟随所有重定向,直到拿到最终响应。再用-w输出最终URL来判断参数是否完整保留。

curl -s -o /dev/null -L -w "最终URL: %{url_effective}\n跳转次数: %{num_redirects}\n" "https://example.com/page?utm_source=google"

这里-s静默模式隐藏进度条,-o /dev/null丢弃响应体,-w输出关键指标。%{url_effective}就是最终落地URL,如果原始参数不在里面,说明中间某次跳转把它丢了。

适用场景:检测完整跳转链路后参数是否保留到底。

命令三:用curl -I HEAD请求检测重定向头

有时候你只想检查响应头不想下载内容,用-I(HEAD请求)更高效。搭配-L就能看到每一跳的响应头。

curl -I -L "https://example.com/page?page=2&sort=price" 2>&1 | grep -E "(HTTP/|Location:)"

输出会按顺序列出每一跳的HTTP状态码和Location头,一目了然地看到哪一步参数被清掉了。比如:

HTTP/2 301
location: https://example.com/page

HTTP/2 200

第一跳301的Location里没有page=2&sort=price,参数在这里就丢了。

适用场景:需要精确定位参数在哪一层重定向丢失。

命令四:用curl --max-redirs逐步截断重定向链

当重定向链很长时,逐层排查更有效率。通过--max-redirs控制跟随次数,每次只看当前跳的Location头。

# 只看第一次重定向的目标
curl -s -o /dev/null --max-redirs 0 -w "状态码: %{http_code}\nLocation: %{redirect_url}\n" "https://example.com/short-link?ref=wechat"

# 跟随2次重定向
curl -s -o /dev/null -L --max-redirs 2 -w "最终URL: %{url_effective}\n" "https://example.com/short-link?ref=wechat"

--max-redirs 0表示不跟随任何重定向,%{redirect_url}输出服务器返回的Location值。对比每一步的URL变化,就能精确找到参数丢失的环节。

适用场景:多层级重定向(短链→CDN→源站→HTTPS跳转)的逐层排查。

命令五:用curl -w @模板批量对比源URL和目标URL

当你有多个URL需要检测时,写一个模板文件批量跑更高效。

先创建模板文件redirect_check.txt

源URL: %{url_input}
最终URL: %{url_effective}
跳转次数: %{num_redirects}
状态码: %{http_code}
重定向耗时: %{time_redirect}s

然后执行批量检测:

while IFS= read -r url; do
  echo "========== $url =========="
  curl -s -o /dev/null -L -w "@redirect_check.txt" "$url"
  echo ""
done < urls.txt

对比源URL和最终URL中的查询参数差异,就能批量发现哪些跳转存在参数丢失。

适用场景:批量巡检大量URL的重定向参数保留情况。

常见参数丢失原因速查

  • Nginx return 301不拼接$args → 使用$request_uri$is_args$args
  • Nginx rewrite尾部带问号 → 问号会清空原始参数,去掉或改用?$args
  • CDN层的"始终使用HTTPS" → 在Cloudflare中用Transform Rules保留查询参数
  • 短链服务未透传参数 → 检查短链服务配置是否拼接原始查询字符串
  • 302重定向POST请求 → 浏览器会自动转GET,参数可能在location中丢失,改用307

总结

用curl排查重定向参数保留问题,核心思路就是:对比源URL和目标URL中的查询字符串,定位丢失环节。单次检测用-v-I,完整链路用-L -w,逐层排查用--max-redirs,批量巡检用-w @模板。五个命令覆盖从单点到批量的全部场景,几分钟就能定位问题根源。

推荐阅读

版权声明

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

发表评论