为什么需要同时输出url_effective和num_redirects?
用curl检测网站重定向时,很多人只知道单独查看最终跳转地址或跳转次数。但这两条信息分开看,就像只知道终点在哪、却不知道走了几站——或者反过来,知道转了几次车、却不知道到了哪里。只有同时拿到url_effective(最终URL)和num_redirects(跳转次数),才能对整条重定向链路做出完整判断。
比如:一个URL跳了5次才到达目的地,这明显不正常;跳了0次但URL变了,说明可能是HTML meta跳转;跳了1次且参数完整保留,这才算正常跳转。下面5个实战技巧,帮你用一条curl命令同时拿到这两个关键数据。
技巧一:-w基本格式同时输出两个变量
最基础的做法,是在-w参数里把url_effective和num_redirects写在同一个格式化字符串中:
curl -L -s -o /dev/null -w "最终URL: %{url_effective}\n跳转次数: %{num_redirects}\n" https://example.com
输出示例:
最终URL: https://www.example.com/home
跳转次数: 1
关键参数说明:
-L:跟随重定向,否则url_effective就是原始URL-s:静默模式,不显示进度条-o /dev/null:丢弃响应体,只看格式化输出(Windows用NUL)-w:write-out格式化,%{变量名}输出对应值
技巧二:制表符分隔输出方便脚本解析
写Shell脚本批量检测时,用制表符分隔输出,方便awk或cut提取:
curl -L -s -o /dev/null -w "%{url_effective}\t%{num_redirects}\n" https://example.com
输出示例:
https://www.example.com/home 1
配合awk可以快速筛选跳转次数异常的URL:
curl -L -s -o /dev/null -w "%{url_effective}\t%{num_redirects}\n" https://example.com | awk -F\t '$2 > 2 {print "异常跳转:", $1, "跳了", $2, "次"}'
技巧三:加入HTTP状态码做三维度诊断
只看最终URL和跳转次数还不够,加上http_code状态码,三个维度一起看:
curl -L -s -o /dev/null -w "状态码: %{http_code}\n最终URL: %{url_effective}\n跳转次数: %{num_redirects}\n" https://example.com
常见诊断场景:
- 状态码200 + 跳转0次:直达,正常
- 状态码200 + 跳转1次:单次重定向,常见HTTP跳HTTPS
- 状态码200 + 跳转3次以上:重定向链路过长,需要优化
- 状态码301/302 + 跳转0次:-L没加或重定向循环
- 状态码000 + 跳转0次:连接失败或DNS解析错误
技巧四:批量检测多个URL的重定向情况
把URL列表放在文件里,用Shell循环批量检测:
#!/bin/bash
while read url; do
result=$(curl -L -s -o /dev/null -w "%{url_effective}\t%{num_redirects}\t%{http_code}" --max-time 10 "$url")
echo -e "$url\t$result"
done < url_list.txt
PowerShell版本:
Get-Content url_list.txt | ForEach-Object {
$url = $_
$result = curl.exe -L -s -o NUL -w "%{url_effective}`t%{num_redirects}`t%{http_code}" --max-time 10 $url
"$url`t$result"
}
技巧五:用-w模板文件管理复杂输出格式
当格式化字符串越来越长,建议把模板写到文件里。创建redirect_check.txt:
原始URL: %{url_effective}
跳转次数: %{num_redirects}
状态码: %{http_code}
总耗时: %{time_total}s
DNS耗时: %{time_namelookup}s
使用方式:
curl -L -s -o /dev/null -w @redirect_check.txt https://example.com
模板文件的好处:
- 格式调整不用改命令行,改文件就行
- 多个脚本可以共享同一个模板
- 变量多了也不会导致命令行过长
常见问题排查
url_effective和原始URL一样是怎么回事?
最常见的原因是忘了加-L参数。不加-L,curl不会跟随重定向,url_effective就是请求的原始URL。另一种情况是服务器返回3xx但--max-redirs设成了0。
num_redirects输出0但URL确实变了?
可能是HTML层面的跳转(meta refresh或JavaScript location),不是HTTP 3xx重定向,curl的num_redirects只统计HTTP层跳转。
Windows下curl和curl.exe有什么区别?
Windows PowerShell中curl是Invoke-WebRequest的别名,curl.exe才是真正的curl程序。要使用-w参数必须用curl.exe。
相关文章推荐
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论