2026.06.15 | youres | 4次围观
curl输出重定向信息的核心痛点
在网站运维和调试过程中,重定向链路追踪是最常见的需求之一。很多开发者只知道用url_effective获取最终URL,却不知道url_redirect能精准定位服务器首次跳转意图。
实际场景中,单独输出其中一个变量往往不够用:
- 只输出url_effective:知道终点但不知道中间跳了几次
- 只输出url_redirect:知道第一跳地址但不知道最终落到哪里
- 批量检测时:需要同时对比起点、跳转点、终点
本文分享3种格式化输出方法,帮你一次性拿到完整的重定向链路信息。
方法一:文本格式化输出(最直观)
使用-w参数配合换行符,直接在终端输出可读性强的结果:
curl -sL -o /dev/null -w "原始URL: %{url_original}\n首次跳转: %{url_redirect}\n最终URL: %{url_effective}\n跳转次数: %{num_redirects}\n" "https://example.com"输出示例:
原始URL: https://example.com
首次跳转: https://www.example.com/
最终URL: https://www.example.com/home
跳转次数: 2关键点说明:
- -s:静默模式,不显示进度条
- -L:跟随重定向(必须加)
- -o /dev/null:丢弃页面内容,只显示-w输出
- \n:换行符,让输出更易读
批量检测脚本示例:
#!/bin/bash
# redirect_chain.sh - 批量检测URL重定向链路
URL_LIST=$1
while IFS= read -r url; do
echo "------"
curl -sL -o /dev/null -w "原始: %{url_original}\n跳转: %{url_redirect}\n终点: %{url_effective}\n次数: %{num_redirects}\n" "$url"
done < "$URL_LIST"使用方法:bash redirect_chain.sh urls.txt
方法二:JSON格式化输出(最易解析)
当需要在程序中处理结果时,JSON格式是最佳选择。curl支持直接输出JSON结构:
curl -sL -o /dev/null -w '{"original":"%{url_original}","redirect":"%{url_redirect}","effective":"%{url_effective}","redirects":%{num_redirects}}\n' "https://example.com"输出示例:
{"original":"https://example.com","redirect":"https://www.example.com/","effective":"https://www.example.com/home","redirects":2}进阶版:添加时间戳和状态码
curl -sL -o /dev/null -w '{"url":"%{url_original}","first_redirect":"%{url_redirect}","final_url":"%{url_effective}","redirects":%{num_redirects},"status":%{http_code},"time":"%{time_total}"}\n' "https://example.com"批量检测并保存到文件:
#!/bin/bash
# redirect_json.sh - 输出JSON格式重定向报告
OUTPUT="redirect_report.json"
echo '[' > "$OUTPUT"
first=true
while IFS= read -r url; do
if [ "$first" = true ]; then
first=false
else
echo ',' >> "$OUTPUT"
fi
curl -sL -o /dev/null -w '{"url":"%{url_original}","redirect":"%{url_redirect}","effective":"%{url_effective}","redirects":%{num_redirects}}' "$url" >> "$OUTPUT"
done < urls.txt
echo "" >> "$OUTPUT"
echo ']' >> "$OUTPUT"
echo "报告已保存到 $OUTPUT"配合jq工具可以轻松筛选和分析:
cat redirect_report.json | jq '.[] | select(.redirects > 3)'方法三:模板文件输出(最灵活)
当格式化需求复杂时,把模板保存到文件,用-w @模板文件调用:
创建模板文件 redirect.tpl:
========================================
URL重定向链路追踪报告
========================================
原始请求: %{url_original}
首次跳转: %{url_redirect}
最终地址: %{url_effective}
跳转次数: %{num_redirects}
状态码: %{http_code}
总耗时: %{time_total}s
========================================使用模板:
curl -sL -o /dev/null -w @redirect.tpl "https://example.com"模板文件优势:
- 避免命令行过长难以维护
- 方便团队共享统一格式
- 支持复杂的多行输出结构
- 修改格式无需改动脚本
url_effective和url_redirect的核心区别
| 变量 | 含义 | 典型值 | 使用场景 |
|---|---|---|---|
| url_effective | 最终到达的URL | https://www.example.com/home | 确认重定向终点 |
| url_redirect | 首次跳转目标 | https://www.example.com/ | 诊断服务器跳转意图 |
| url_original | 原始请求URL | https://example.com | 记录起始地址 |
| num_redirects | 跳转次数 | 2 | 评估重定向链路复杂度 |
典型应用场景:
- UTM参数追踪:检查首次跳转是否携带营销参数
- CDN诊断:对比url_redirect和url_effective判断CDN层是否额外跳转
- 短链解析:url_redirect直接看到短链指向的真实地址
- 循环重定向排查:num_redirects异常高时快速定位
实战:检测UTM参数是否在首次跳转保留
#!/bin/bash
# utm_check.sh - 检测UTM参数在重定向链路中是否保留
URL="https://short.link/abc?utm_source=email&utm_medium=newsletter"
result=$(curl -sL -o /dev/null -w "%{url_redirect}|%{url_effective}" "$URL")
first_redirect=$(echo "$result" | cut -d'|' -f1)
final_url=$(echo "$result" | cut -d'|' -f2)
echo "原始URL: $URL"
echo "首次跳转: $first_redirect"
echo "最终地址: $final_url"
# 检查UTM参数是否在首次跳转保留
if [[ "$first_redirect" == *"utm_source="* ]]; then
echo "✓ 首次跳转保留UTM参数"
else
echo "✗ 首次跳转丢失UTM参数"
fi
# 检查UTM参数是否在最终地址保留
if [[ "$final_url" == *"utm_source="* ]]; then
echo "✓ 最终地址保留UTM参数"
else
echo "✗ 最终地址丢失UTM参数"
fi常见问题排查
url_redirect为空但url_effective有值
这种情况说明:
- 服务器直接返回200(无重定向)
- 或者使用了JavaScript跳转(curl无法识别)
解决方法:先用curl -I查看响应头
curl -I "https://example.com" 2>&1 | grep -i "location"num_redirects为0但url_effective与url_original不同
这是curl版本差异导致的统计bug,升级curl版本即可:
curl --version建议使用7.50以上版本。
总结
curl同时输出url_effective和url_redirect的方法总结:
- 文本格式:快速查看,适合单次检测
- JSON格式:程序解析友好,适合批量检测
- 模板文件:格式可维护,适合团队协作
掌握这三种方法,重定向链路诊断效率至少提升一倍。建议根据实际场景选择最适合的格式,批量检测时优先考虑JSON输出配合jq分析。
相关文章推荐
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论