0

curl批量检测重定向次数和最终地址:3个Shell脚本方案让网站巡检效率翻倍

2026.06.16 | youres | 8次围观

为什么需要批量检测重定向次数和最终地址

网站运维中,重定向链路排查是高频需求。比如迁移域名后需要验证所有旧链接是否正确跳转、短链服务需要确认营销链接的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_redirectsurl_effective两个变量,再套上Shell循环或xargs并行。三个方案从简单到专业,按需取用。日常巡检推荐方案三(CSV归档),几百个URL快速扫一遍用方案二(xargs并行),临时排查几个链接用方案一(单线程)就够了。

相关文章推荐:

版权声明

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

发表评论