为什么需要批量检测重定向次数和最终地址
网站运维中,重定向链路排查是高频需求。比如迁移域名后需要验证所有旧链接是否正确跳转、短链服务需要确认营销链接的UTM参数是否在跳转过程中丢失、CDN配置变更后需要全站验证重定向路径是否正常。手动一个一个用浏览器打开检查太慢了,curl配合Shell脚本才是正解。
核心思路很简单:用curl的-w参数输出num_redirects(重定向次数)和url_effective(最终跳转地址),然后批量处理URL列表。下面直接上3个实战方案。
方案一:单线程逐个检测——最简单直接
适合URL数量不多(几十个以内)的场景,不需要任何外部依赖。
脚本代码
#!/bin/bash
# redirect_check.sh - 批量检测重定向次数和最终地址
URL_FILE=$1
TEMPLATE='redirects: %{num_redirects} final_url: %{url_effective}'
while IFS= read -r url; do
[ -z "$url" ] && continue
[ "${url:0:1}" = "#" ] && continue
result=$(curl -o /dev/null -s -L -w "$TEMPLATE" "$url" 2>/dev/null)
redirects=$(echo "$result" | grep -oP 'redirects: \K[0-9]+')
final_url=$(echo "$result" | grep -oP 'final_url: \K.*')
echo "$url | $redirects | $final_url"
done < "$URL_FILE"使用方法
# 准备URL列表文件
cat > urls.txt << EOF
https://example.com/old-page
https://example.com/short-link
https://example.com/landing-a
EOF
# 执行检测
chmod +x redirect_check.sh
./redirect_check.sh urls.txt输出示例
https://example.com/old-page | 2 | https://example.com/new-page
https://example.com/short-link | 1 | https://marketing.example.com/campaign
https://example.com/landing-a | 0 | https://example.com/landing-a关键参数解释
-L:跟随重定向,确保能获取到最终地址-w:自定义输出格式,num_redirects输出跳转次数,url_effective输出最终URL-o /dev/null:丢弃响应体,只关心头部信息-s:静默模式,不显示进度条
方案二:xargs并行加速——适合大批量检测
当URL列表达到几百甚至上千个时,单线程太慢。用xargs的-P参数实现并行请求,速度提升明显。
脚本代码
#!/bin/bash
# parallel_redirect_check.sh - 并行批量检测重定向
URL_FILE=$1
PARALLEL=${2:-10}
echo "原始URL | 跳转次数 | 最终地址"
echo "------- | ------- | --------"
cat "$URL_FILE" | grep -v '^#' | grep -v '^$' | \
xargs -P "$PARALLEL" -I {} bash -c '
result=$(curl -o /dev/null -s -L -w "%{num_redirects} %{url_effective}" "{}" 2>/dev/null)
redirects=$(echo "$result" | awk "{print \$1}")
final=$(echo "$result" | awk "{print \$2}")
echo "{} | $redirects | $final"
'使用方法
# 20个并行同时检测
./parallel_redirect_check.sh urls.txt 20并行数选择建议
- 本地测试:P=5~10,避免对目标服务器造成压力
- 内网巡检:P=20~50,内网延迟低可以适当加大
- 生产环境:P=3~5,保守策略,防止触发WAF限流
方案三:CSV自动归档输出——巡检结果结构化
日常巡检的结果需要保存留痕,输出CSV格式可以直接用Excel打开分析,也方便后续做趋势对比。
脚本代码
#!/bin/bash
# redirect_csv_report.sh - 重定向巡检CSV报告
URL_FILE=$1
OUTPUT=${2:-"redirect_report_$(date +%Y%m%d).csv"}
PARALLEL=${3:-10}
# 写入CSV表头
echo "原始URL,跳转次数,最终地址,状态码,耗时(秒)" > "$OUTPUT"
cat "$URL_FILE" | grep -v '^#' | grep -v '^$' | \
xargs -P "$PARALLEL" -I {} bash -c '
result=$(curl -o /dev/null -s -L \
-w "%{num_redirects}|%{url_effective}|%{http_code}|%{time_total}" \
"{}" 2>/dev/null)
redirects=$(echo "$result" | cut -d"|" -f1)
final=$(echo "$result" | cut -d"|" -f2)
code=$(echo "$result" | cut -d"|" -f3)
time_total=$(echo "$result" | cut -d"|" -f4)
echo "{},{},${final},${code},${time_total}"
' >> "$OUTPUT"
echo "报告已生成: $OUTPUT"CSV输出示例
原始URL,跳转次数,最终地址,状态码,耗时(秒)
https://example.com/old-page,2,https://example.com/new-page,200,0.532
https://example.com/short-link,1,https://marketing.example.com/campaign,200,0.231
https://example.com/broken-link,0,https://example.com/broken-link,404,0.102三个方案对比
| 方案 | 适用场景 | 速度 | 输出格式 | 复杂度 |
|---|---|---|---|---|
| 方案一:单线程 | 少量URL快速检测 | 慢 | 终端文本 | 低 |
| 方案二:xargs并行 | 大批量URL(数百+) | 快 | 终端文本 | 中 |
| 方案三:CSV归档 | 日常巡检留痕 | 快 | CSV文件 | 中 |
踩坑经验:3个常见问题
1. num_redirects为0但实际发生了重定向
这种情况通常是因为没有加-L参数。curl默认不跟随重定向,如果不加-L,num_redirects会一直输出0,因为curl根本没去跟踪后续跳转。记住:检测重定向次数必须加-L。
2. url_effective和原始URL一样
说明没有发生重定向,或者服务器返回的不是标准3xx状态码而是JavaScript跳转。curl只能跟踪HTTP协议层面的重定向,JS跳转需要用无头浏览器处理。
3. 批量检测触发目标服务器限流
降低并行数(P参数),或在循环中增加sleep间隔。对于生产环境的目标,建议P不超过5,每次请求间隔0.5秒以上:
# 带延迟的温和检测
while IFS= read -r url; do
[ -z "$url" ] && continue
result=$(curl -o /dev/null -s -L -w "%{num_redirects} %{url_effective}" "$url")
echo "$url | $result"
sleep 0.5
done < urls.txt延伸应用
- 配合crontab定时巡检:每天凌晨自动检测关键URL列表,结果发邮件
- 异常自动告警:当某个URL的重定向次数超过阈值时,触发钉钉或飞书告警
- 趋势分析:每次巡检结果追加到CSV,用awk对比历史数据发现跳转链路变化
- UTM参数验证:在检测最终URL时检查UTM参数是否保留,确保营销追踪正常
总结
批量检测重定向次数和最终地址,本质就是curl -w参数配合num_redirects和url_effective两个变量,再套上Shell循环或xargs并行。三个方案从简单到专业,按需取用。日常巡检推荐方案三(CSV归档),几百个URL快速扫一遍用方案二(xargs并行),临时排查几个链接用方案一(单线程)就够了。
相关文章推荐:
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论