网站维护中遇到重定向问题,最靠谱的诊断工具就是curl。但curl命令参数不少,到底该用哪个、怎么组合,很多人不清楚。这篇指南把所有场景串起来讲,让你遇到任何重定向问题都能快速定位。
一、为什么用curl诊断重定向
浏览器调试重定向有局限:看不到完整的中间过程,看不到每次跳转的响应头,也不好模拟不同参数场景。curl则完全不同——可以逐跳观察、可脚本化、能输出结构化数据,是服务器端运维和SEO排查的必备工具。
二、确认环境:curl版本检查
先确认系统里curl版本够新,支持-w参数的全部变量:
curl --version
Linux/macOS通常自带curl。Windows 10及以上版本中,PowerShell 7+内置了curl别名,但Invoke-WebRequest和curl.exe行为略有差异(见本文最后一节)。
三、5个核心命令,从入门到精通
命令1:curl -L 跟随重定向(基础中的基础)
-L参数让curl跟随服务器返回的301/302/307/308等重定向,自动跳转到最终页面。不带这个参数,curl只会显示第一次响应的响应头,不会继续请求。
# 跟随重定向,显示最终页面内容
curl -L https://example.com/old-url
# 跟随重定向,只看响应头不下载内容
curl -L -I https://example.com/old-url
# 跟随重定向,把跳转过程输出到标准错误
curl -L -v https://example.com/old-url 2>&1 | grep -E "location|< HTTP"
适用场景:确认重定向是否生效,以及最终URL是哪个。
命令2:curl -v 查看详细跳转过程(调试神器)
-v(verbose)输出请求和响应的完整过程,包括每次请求的请求行、响应头、Connection信息。配合重定向场景,可以清楚看到每一跳发生了什么。
# 查看重定向完整链路
curl -v https://short.url/abc?utm_source=test 2>&1
适用场景:查看每一跳的Location头,判断参数在哪一步丢失或者在哪一步被修改。
命令3:curl -I 逐跳查看响应头(不跟随重定向)
单独使用-I只发HEAD请求,不跟随重定向,可以逐层查看每次跳转的响应头和状态码。
# 逐跳查看前3次重定向
curl -I --max-redirs 3 https://short.url/abc?utm_source=baidu
# 批量查看多个URL的跳转链路
for url in https://a.com https://b.com https://c.com; do
echo "=== $url ==="
curl -I -L --max-redirs 5 -o /dev/null -s -w "%{http_code} -> %{url_effective}\n" "$url"
done
适用场景:UTM参数丢失排查、短链参数追踪、多跳重定向链路巡检。
命令4:curl -w 输出结构化信息(精确提取数据)
-w参数可以从curl的输出中提取特定信息,不干扰实际内容。配合格式化输出,可以提取重定向相关的关键数据。
# 输出最终URL(重定向终点)
curl -L -s -o /dev/null -w "最终URL: %{url_effective}\n" https://short.url/abc
# 输出重定向次数
curl -L -s -o /dev/null -w "跳转次数: %{num_redirects}\n" https://short.url/abc
# 同时输出状态码、最终URL、跳转次数、总耗时
curl -L -s -o /dev/null -w "状态码: %{http_code} 跳转次数: %{num_redirects} 最终URL: %{url_effective} 总耗时: %{time_total}s\n" https://short.url/abc
适用场景:脚本自动化巡检、批量检测多个URL、导出到CSV报告。
命令5:curl --max-redirs 控制跳转次数(防止无限循环)
默认curl跟随重定向最多50次。用--max-redirs可以精确控制,防止被恶意重定向循环打满连接数,也可以分步诊断每一步。
# 只跟随到第一步,观察第一跳的Location
curl -L --max-redirs 1 https://short.url/abc -v 2>&1 | grep location
# 禁止跟随重定向,只看第一步响应头
curl --max-redirs 0 -I https://short.url/abc
# PowerShell中调用curl.exe
& "C:\Program Files\Git\usr\bin\curl.exe" -L --max-redirs 5 -o nul -s -w "最终状态码: %{http_code}\n" "https://short.url/abc"
适用场景:诊断ERR_TOO_MANY_REDIRECTS无限循环问题、控制调试深度。
四、常见问题快速对照表
| 问题 | 推荐命令 | 判断方法 |
|---|---|---|
| 重定向是否生效 | curl -L https://源URL | 有内容返回则生效 |
| 参数在哪一步丢失 | curl -I --max-redirs 0 逐个URL | Location头参数对比 |
| 最终URL是什么 | curl -L -w url_effective | 输出即为终点 |
| 重定向次数多少 | curl -L -w num_redirects | 次数大于3需检查 |
| 无限循环ERR_TOO_MANY | curl --max-redirs 2 | 看到循环模式 |
| 批量巡检 | curl批量加-w csv | 导出报告分析 |
五、Windows PowerShell中的注意事项
PowerShell 6及以上版本中,curl是Invoke-WebRequest的别名,不是真正的curl.exe。如果要使用curl的全部-w参数,需要直接调用curl.exe:
# 直接调用curl.exe(确保路径正确)
& "C:\Program Files\Git\usr\bin\curl.exe" -L -w "最终URL: %{url_effective}\n" https://example.com
# PowerShell原生方式(不支持-w全部变量)
$resp = Invoke-WebRequest -Uri 'https://example.com' -MaximumRedirection 5
$resp.Headers[Location]
$resp.StatusCode
六、实战:UTM参数丢失诊断完整流程
以一条营销短链为例,完整演示诊断流程:
# 第1步:发一个带UTM参数的请求,跟踪完整链路
curl -L -v https://short.cn/abc?utm_source=weibo&ut_medium=banner&ut_campaign=summer 2>&1 | grep -E "(location|< HTTP)"
# 第2步:逐跳检查参数在哪一步丢失
curl -I --max-redirs 0 https://short.cn/abc?utm_source=weibo
# 查看第一步的Location头
# 第3步:提取最终URL确认参数最终状态
curl -L -s -o /dev/null -w "最终URL: %{url_effective}\n" "https://short.cn/abc?utm_source=weibo&ut_medium=banner"
# 第4步:批量巡检
while read url; do
curl -L -s -o /dev/null -w "$url | %{http_code} | %{num_redirects} | %{url_effective}\n" "$url"
done < urls.txt
总结
curl诊断重定向的核心就5个命令:-L跟随跳转、-v看过程、-I逐跳分析、-w提取数据、--max-redirs控制深度。遇到任何重定向问题,先用verbose模式看完整链路,再用-w提取精确数据,脚本化之后可以做成批量巡检方案,定期检测网站重定向健康度。
如果这篇内容有帮助,欢迎收藏。遇到具体问题,欢迎在评论区留言。
相关推荐:
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论