0

curl -w同时输出跳转次数和最终URL:3个格式化输出技巧让重定向检测事半功倍

2026.06.04 | youres | 18次围观

什么是num_redirects和url_effective?

在使用curl进行网站调试时,-w(或--write-out)参数允许我们在请求完成后输出特定的变量值。其中,num_redirectsurl_effective是两个非常实用的重定向相关变量。

num_redirects表示curl在请求过程中跟随的重定向次数。如果返回0,说明没有发生重定向;如果返回3,说明经历了3次重定向跳转。

url_effective则表示curl最终访问到的URL地址。当发生重定向时,这个变量会返回重定向链路的最后一个URL,也就是用户或程序最终访问到的页面地址。

这两个变量组合起来使用,可以快速诊断网站的重定向行为:跳转了几次?最终跳到了哪里?这些信息对于SEO优化、网站性能分析、重定向链路排查都非常有价值。

为什么需要同时输出跳转次数和最终URL?

在实际的网站巡检和调试工作中,单独查看跳转次数或最终URL往往不够。我们需要同时获取这两个信息,才能对重定向行为做出准确判断。

举个例子:你发现某个页面的流量归因异常,怀疑是UTM参数在重定向过程中丢失。这时候,你需要知道:这个页面经历了几次重定向?最终跳到了哪个URL?如果只看到最终URL(url_effective),你不知道中间经历了几次跳转;如果只看到跳转次数(num_redirects),你不知道最终落地页是哪里。只有同时输出这两个变量,才能快速定位问题。

另一个常见场景是批量网站巡检。当你需要检查100个域名是否配置了正确的HTTPS重定向时,同时输出跳转次数和最终URL可以让你一眼看出:哪些域名没有跳转(num_redirects=0),哪些域名跳转到了正确的HTTPS地址(url_effective以https://开头)。这种批量检测的效率,比逐个手动检查高出几个数量级。

3个格式化输出技巧

技巧1:使用-w参数直接输出

最直接的方式是在命令行中直接使用-w参数,配合格式化字符串输出变量值。

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

这个命令的含义是:

  • -L:跟随重定向
  • -w:请求完成后输出格式化字符串
  • -o /dev/null:将响应内容丢弃(不输出到终端)
  • -s:静默模式,不显示进度条

输出结果类似:

跳转次数: 2
最终URL: https://www.example.com/

这种方式的优点是简单直接,适合快速调试。缺点是格式化字符串比较复杂时,命令行会变得很长,不易维护。

技巧2:使用@模板文件

当需要处理多个变量或复杂的输出格式时,可以使用-w @模板文件的方式,将格式化字符串写入一个独立的模板文件。

首先,创建一个模板文件curl-format.txt

跳转次数: %{num_redirects}
最终URL: %{url_effective}
HTTP状态码: %{http_code}
总耗时: %{time_total}s

然后,在curl命令中引用这个模板文件:

curl -L -w "@curl-format.txt" -o /dev/null -s https://example.com

这种方式的优点是:

  • 模板文件可以复用,多个脚本可以共享同一个格式化模板
  • 支持输出多个变量,格式化更灵活
  • 命令更简洁,易于维护

对于需要批量检测的场景,这种方式尤其有用。你可以把模板文件放在版本控制系统中,团队成员共享同一套输出格式。

技巧3:输出为JSON格式

在现代的自动化巡检系统中,JSON格式的数据更易于程序解析和处理。我们可以将curl的输出格式化为JSON。

创建一个JSON格式的模板文件curl-json-format.txt

{
  "num_redirects": %{num_redirects},
  "url_effective": "%{url_effective}",
  "http_code": %{http_code},
  "time_total": %{time_total}
}

然后执行:

curl -L -w "@curl-json-format.txt" -o /dev/null -s https://example.com

输出结果是一个标准的JSON对象:

{
  "num_redirects": 2,
  "url_effective": "https://www.example.com/",
  "http_code": 200,
  "time_total": 0.345
}

这个JSON输出可以被Python、Shell脚本、PowerShell等多种语言轻松解析,非常适合集成到自动化巡检系统中。

实战案例:批量检测重定向

在实际工作中,我们经常需要批量检测多个域名的重定向行为。下面是一个完整的Shell脚本示例,使用curl同时输出跳转次数和最终URL,并将结果保存为CSV文件。

#!/bin/bash

# 域名列表
domains=(
  "http://example.com"
  "http://example.org"
  "http://example.net"
)

# 输出CSV文件
output="redirect-report.csv"
echo "域名,跳转次数,最终URL,HTTP状态码" > "$output"

for domain in "${domains[@]}"; do
  # 使用curl获取重定向信息
  result=$(curl -L -w "@curl-json-format.txt" -o /dev/null -s "$domain")
  
  # 解析JSON结果(需要系统安装jq工具)
  num_redirects=$(echo "$result" | jq -r '.num_redirects')
  url_effective=$(echo "$result" | jq -r '.url_effective')
  http_code=$(echo "$result" | jq -r '.http_code')
  
  # 写入CSV
  echo "$domain,$num_redirects,$url_effective,$http_code" >> "$output"
done

echo "检测完成,结果已保存到 $output"

这个脚本的核心逻辑是:

  1. 遍历域名列表
  2. 使用curl获取每个域名的重定向信息(JSON格式)
  3. 使用jq解析JSON结果
  4. 将结果写入CSV文件

对于Windows用户,可以使用PowerShell实现类似的功能。PowerShell的Invoke-WebRequest cmdlet也可以获取重定向信息,但需要注意Windows的curl实际上是Invoke-WebRequest的别名,而不是GNU curl。如果需要使用GNU curl的功能,需要显式调用curl.exe

常见问题排查

问题1:num_redirects输出为0,但明明发生了重定向

可能的原因:

  • 没有使用-L参数,curl默认不跟随重定向
  • 重定向次数超过了curl的默认限制(默认是50次)
  • 重定向是JavaScript跳转或Meta Refresh,curl无法跟随

解决方法:确保使用了-L参数;如果重定向次数过多,可以使用--max-redirs参数增加限制。

问题2:url_effective输出为空

可能的原因:

  • 没有发生重定向,url_effective的值就是原始请求的URL
  • 使用了-I(HEAD请求),某些服务器对HEAD请求的重定向行为与GET不同

解决方法:检查是否发生了重定向;尝试去掉-I参数,使用正常的GET请求。

问题3:输出中包含中文,保存为CSV后Excel打开乱码

这是Windows下常见的问题。CSV文件如果包含中文,需要在文件开头添加BOM(Byte Order Mark),Excel才能正确识别UTF-8编码。

解决方法:在Shell脚本中,可以使用printf '\xEF\xBB\xBF'在CSV文件开头写入BOM;在PowerShell中,使用Out-FileExport-Csv时指定-Encoding UTF8(PowerShell 5.x默认不带BOM,需要额外处理)。

总结

同时输出跳转次数(num_redirects)和最终URL(url_effective)是curl重定向检测的实用技巧。通过-w参数,我们可以灵活地格式化输出内容;通过模板文件,我们可以复用输出格式;通过JSON格式输出,我们可以将检测结果集成到自动化系统中。

无论是快速调试单个URL,还是批量巡检成百上千个域名,掌握这个技巧都能让你的工作效率显著提升。

相关文章推荐

版权声明

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

发表评论