0

curl同时输出url_effective和url_redirect方法:3种格式化技巧让重定向链路诊断效率翻倍

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最终到达的URLhttps://www.example.com/home确认重定向终点
url_redirect首次跳转目标https://www.example.com/诊断服务器跳转意图
url_original原始请求URLhttps://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的方法总结:

  1. 文本格式:快速查看,适合单次检测
  2. JSON格式:程序解析友好,适合批量检测
  3. 模板文件:格式可维护,适合团队协作

掌握这三种方法,重定向链路诊断效率至少提升一倍。建议根据实际场景选择最适合的格式,批量检测时优先考虑JSON输出配合jq分析。

相关文章推荐

版权声明

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

发表评论