0

curl url_effective配合num_redirects组合使用:3个实战场景让重定向链路无处遁形

2026.06.04 | youres | 31次围观

curl url_effective配合num_redirects组合使用:3个实战场景让重定向链路无处遁形

用 curl 调试重定向时,很多人只知道 -L 跟随跳转,但真正要把重定向链路"看透",需要把 url_effectivenum_redirects 这两个变量组合起来用。本文用3个实战场景,把这个组合的完整用法讲清楚。

先搞清楚两个变量各自是什么

url_effective:最终落在哪个URL

url_effective 是 curl 执行完所有跳转后,最终访问到的那个URL。不管中间跳了多少次,这个变量永远指向"最后一跳"。

curl -s -o /dev/null -w "%{url_effective}\n" http://example.com

如果 example.com 跳了3次,url_effective 输出的是第3次跳转后的最终地址,不是第1次。

num_redirects:到底跳了几次

num_redirects 是 curl 这次请求中经历的跳转次数,是一个整数。

curl -s -o /dev/null -w "%{num_redirects}\n" http://example.com

返回 0 表示没有跳转,返回 3 表示跳了3次。

为什么要组合使用

单独用 url_effective,你只知道"最后到了哪里",不知道"跳了几跳"。单独用 num_redirects,你只知道"跳了几次",不知道"最后落在哪里"。

组合起来用,才能完整回答两个问题:

  1. 这个URL到底跳了几次?
  2. 跳完之后最终落在哪个地址?

场景一:快速判断短链是否跳转到预期目标

短链服务(如 bit.ly、t.co)背后是一个或多个301/302跳转。用这个组合可以快速验证短链的最终去向:

curl -s -o /dev/null -w "跳转次数: %{num_redirects}\n最终地址: %{url_effective}\n" https://bit.ly/xxxx

输出示例:

跳转次数: 2
最终地址: https://www.example.com/landing-page?utm_source=xxx

这一步能直接看出:短链跳了几次、最终URL里UTM参数是否还在。如果最终地址里UTM参数消失了,就可以定位是哪一跳的问题。

场景二:批量巡检网站重定向配置

写一个简单的Shell脚本,用这个组合批量检查一组域名:

#!/bin/bash
urls=(
  "http://example.com"
  "http://test.com"
  "https://demo.com"
)
for url in "${urls[@]}"; do
  result=$(curl -s -o /dev/null -w "%{num_redirects},%{url_effective}" -L "$url")
  count=$(echo "$result" | cut -d',' -f1)
  final=$(echo "$result" | cut -d',' -f2)
  echo "$url | 跳转次数: $count | 最终地址: $final"
done

这个脚本的输出一目了然:

http://example.com | 跳转次数: 2 | 最终地址: https://www.example.com/
test.com | 跳转次数: 0 | 最终地址: http://test.com/
demo.com | 跳转次数: 3 | 最终地址: https://demo.com/new-path/

跳转次数为0,说明没有配置重定向;跳转次数异常多(比如 >5),可能是重定向循环或者配置有问题。

场景三:排查重定向循环和异常跳转

当网站出现 ERR_TOO_MANY_REDIRECTS 错误时,这个组合能帮你快速定位问题:

curl -s -o /dev/null -w "跳转次数: %{num_redirects}\n最终地址: %{url_effective}\n" -L --max-redirs 10 http://problem-site.com

如果 num_redirects 达到了 --max-redirs 设置的值(比如10),说明存在重定向循环。结合 -v 参数可以看到每一跳的响应头:

curl -v -L --max-redirs 10 http://problem-site.com 2>&1 | grep -E "Location:|HTTP/"

用格式化模板让输出更清晰

每次都在命令行写一长串 -w 参数很麻烦,可以把输出格式写成模板文件:

# redirect_check.txt
跳转次数:  %{num_redirects}
最终地址:  %{url_effective}
HTTP状态码: %{http_code}
总耗时:    %{time_total}s

然后调用:

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

输出更规范,也方便把结果写入日志文件做长期追踪。

常见问题排查

num_redirects 输出为0,但明明配置了301

检查是否加了 -L 参数。num_redirects 统计的是 curl 实际跟随的重定向次数,没有 -L 就不会跟随跳转,次数永远是0。

url_effective 输出为空

没有加 -L 参数,或者请求本身失败(DNS解析失败、连接超时等)。url_effective 只有在请求成功完成后才有值。

PowerShell 里的写法

Windows 的 PowerShell 自带 curl 是 Invoke-WebRequest 的别名,不是真正的 curl。要用真正的 curl,需要:

# 先确认 curl 路径
Get-Command curl
# 如果指向 Invoke-WebRequest,用完整路径调用真正的 curl
C:\Windows\System32\curl.exe -s -o $null -w "跳转次数: %{num_redirects}`n最终地址: %{url_effective}`n" -L http://example.com

或者用 --% 参数告诉 PowerShell 不要解析后面的内容:

curl --% -s -o NUL -w "跳转次数: %{num_redirects}\n最终地址: %{url_effective}\n" -L http://example.com

总结

url_effective + num_redirects 这个组合,核心价值是同时掌握"跳了几次"和"最后到哪里"。配合 -L-v--max-redirs 等参数,能覆盖从日常巡检到深度排查的大部分重定向诊断场景。

相关文章

版权声明

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

发表评论