为什么需要多变量组合输出
用 curl 诊断重定向问题时,很多人只用 -w 输出单个变量,比如只看最终 URL 或跳转次数。但真正要把重定向链路"看透",需要把多个变量组合起来——比如同时拿到最终地址、跳转次数、总耗时、HTTP 状态码,才能对整条链路做出完整判断。
举个例子:一个 URL 跳了 5 次才到达目的地,这明显不正常;跳了 0 次但 URL 变了,说明可能是 HTML meta 刷新或 JS 跳转,curl -L 根本检测不到。只有多变量组合输出,才能一次性把这些问题都暴露出来。
curl -w 格式化输出的两种用法
curl 的 -w(或 --write-out)参数允许你在请求完成后,按照指定格式输出变量值。有两种用法:
方法一:直接在命令行写格式字符串
curl -o /dev/null -s -w "\n最终URL: %{url_effective}\n跳转次数: %{num_redirects}\nHTTP状态码: %{http_code}\n总耗时: %{time_total}s\n" -L https://example.com
这种方式适合快速测试,但格式字符串一旦复杂起来,命令行会变得很难读,而且特殊字符需要仔细转义。
方法二:使用 @ 模板文件(推荐)
curl -o /dev/null -s -w "@redirect_diag.txt" -L https://example.com
把格式字符串写在一个文件里(比如 redirect_diag.txt),然后用 -w "@文件名" 引用。这是生产环境和批量检测的首选方案,模板可以复用,也方便版本管理。
5个实战模板(核心内容)
下面这 5 个模板文件,覆盖了重定向诊断的大部分实战场景。每个模板都可以直接保存成文件使用。
模板1:重定向全链路诊断(最常用)
保存为 redirect_full.txt:
========== 重定向诊断结果 ==========
最终URL: %{url_effective}
跳转次数: %{num_redirects}
最终HTTP状态码: %{http_code}
首次IP: %{primary_ip}
最终IP: %{remote_ip}
总耗时: %{time_total}s
重定向耗时: %{time_redirect}s
========================================
使用命令:
curl -o /dev/null -s -w "@redirect_full.txt" -L https://example.com
这个模板一次性输出了重定向诊断最需要关注的 7 个指标。特别说明一下 time_redirect:它只计算重定向阶段的耗时,不包含最后一次请求的连接和数据传输时间,非常适合判断"是不是重定向本身太慢"。
模板2:重定向性能分析
保存为 redirect_perf.txt:
========== 重定向性能分析 ==========
DNS解析时间: %{time_namelookup}s
TCP连接时间: %{time_connect}s
TLS握手时间: %{time_appconnect}s
重定向阶段耗时: %{time_redirect}s
首字节时间: %{time_starttransfer}s
总耗时: %{time_total}s
跳转次数: %{num_redirects}
========================================
这个模板专注于性能分析。解读要点:
time_namelookup高 → DNS 解析慢,考虑换 DNS 或加本地缓存time_connect高 → 网络延迟大,或服务器离客户端太远time_appconnect高 → TLS 握手慢,可能是证书链太长或加密套件协商慢time_redirect高且num_redirects大 → 重定向链路过长,每次跳转都有额外延迟
模板3:批量检测重定向状态码
保存为 redirect_status.txt:
%{url_effective},%{num_redirects},%{http_code},%{time_total}
配合 Shell 批量检测脚本使用:
#!/bin/bash
while read url; do
curl -o /dev/null -s -w "@redirect_status.txt" -L "$url"
done < url_list.txt > redirect_report.csv
输出的 CSV 格式可以直接用 Excel 打开分析。每行包含:最终URL、跳转次数、HTTP状态码、总耗时。
模板4:短链 UTM 参数追踪
保存为 shortlink_utm.txt:
========== 短链UTM参数追踪 ==========
原始URL: %{url}
最终URL: %{url_effective}
跳转次数: %{num_redirects}
最终HTTP状态码: %{http_code}
========================================
使用命令:
curl -o /dev/null -s -w "@shortlink_utm.txt" -L -D - "https://short.link/xxx" 2>&1 | grep -E "Location:|==========|原始|最终|跳转|HTTP"
这个模板的关键是 %{url} 变量——它输出原始请求的 URL,和 %{url_effective}(最终 URL)对比,可以直观看到 URL 是否被改写,UTM 参数是否在跳转过程中丢失。
模板5:网站健康巡检 CSV 输出
保存为 health_check.txt:
%{url_effective},%{http_code},%{num_redirects},%{time_total},%{size_download}
批量巡检脚本:
#!/bin/bash
echo "URL,HTTP状态码,跳转次数,总耗时,下载大小" > health_report.csv
while read url; do
curl -o /dev/null -s -w "@health_check.txt" -L --max-time 10 "$url" >> health_report.csv
done < url_list.txt
这个模板输出的 CSV 可以直接导入监控系统或用 Excel 条件格式高亮异常(比如状态码非 200、跳转次数大于 3、总耗时大于 5 秒)。
模板文件怎么写(@filename 详解)
-w "@文件名" 中的 @ 告诉 curl 从指定文件中读取格式字符串。文件内容就是你要输出的格式,支持所有 curl 支持的变量(完整变量列表见 curl -w格式化输出详解:变量大全+6个实战场景)。
写模板文件时的注意事项:
- 文件路径可以是绝对路径或相对于当前目录的相对路径
- 文件中可以用
\n表示换行,用\t表示制表符 - 如果文件路径中包含空格,需要用引号括起来:
-w "@\"C:\My Documents\template.txt\""(Windows)或-w '@/path/with spaces/template.txt'(Linux/macOS) - 文件不存在时 curl 会报错:
curl: (63) Could not load file
PowerShell 适配注意事项
在 Windows 的 PowerShell 中使用 curl(实际上是 Invoke-WebRequest 的别名),-w 参数的行为和多变量输出方式和 Linux 下的 curl 有差异。如果需要在 PowerShell 中实现相同的多变量组合输出效果,有两种方案:
- 方案A:安装真正的 curl(从 curl.se 下载),然后用
curl.exe调用,绕过 PowerShell 的别名 - 方案B:用 PowerShell 的
Invoke-WebRequest配合-MaximumRedirection参数,手动提取重定向信息(参考 PowerShell curl url_effective替代方案)
如果坚持在 PowerShell 中用真正的 curl,注意模板文件的路径要写成 Windows 风格:
curl.exe -o NUL -s -w "@C:\temp\redirect_full.txt" -L https://example.com
注意 -o NUL(不是 /dev/null),以及模板文件路径用反斜杠。
总结
curl -w 多变量组合输出是重定向诊断的利器。核心要点:
- 简单测试用命令行内联格式字符串,生产环境用
@模板文件 - 最常用变量组合:
url_effective+num_redirects+http_code+time_total - 性能分析加
time_redirect、time_namelookup、time_connect - 批量检测输出 CSV 格式,方便后续分析
- PowerShell 用户注意 curl 别名问题,用
curl.exe绕过
掌握这 5 个模板,重定向诊断效率至少提升 3 倍。不用再一条一条命令试,一个模板文件搞定所有信息。
相关文章:
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论