0

curl批量检测网站跳转链路完整教程:3个实战脚本让全网页面重定向一览无余

2026.06.15 | youres | 3次围观

为什么需要批量检测网站跳转链路

网站运维中,URL重定向是一个看似简单但影响巨大的环节。不管是网站迁移HTTPS、短链跳转、CDN加速、还是营销链接追踪,只要涉及重定向,就需要知道每一步跳到了哪里、跳了几次、最终地址对不对。

单条URL检测用curl -w配合url_effective就能搞定,但当你手上有几十上百条链接需要巡检时,一条条测下去,既费时间又容易漏掉异常。这时候就需要一套能批量检测网站跳转链路的完整方案。

批量检测的核心思路:循环+格式化输出

批量检测跳转链路的逻辑并不复杂:读取URL列表 → 逐个用curl请求并记录重定向信息 → 汇总输出结果。关键是要设计好输出格式,让结果一目了然,最好还能自动化存档。

方案一:最简版Shell脚本——逐条检测输出表格

这个方案适合刚接触批量检测的场景,简单直接,不需要任何额外工具依赖。

#!/bin/bash
# 批量检测网站跳转链路 - 简易版
INPUT_FILE="urls.txt"
OUTPUT_FILE="redirect_report.txt"

printf "%-40s %-6s %-40s\n" "原始URL" "跳转次数" "最终地址" > $OUTPUT_FILE
printf "%-40s %-6s %-40s\n" "--------" "--------" "--------" >> $OUTPUT_FILE

while read url; do
  final_url=$(curl -s -o /dev/null -w "%{url_effective}" -L "$url")
  redirect_count=$(curl -s -o /dev/null -w "%{num_redirects}" -L "$url")
  printf "%-40s %-6s %-40s\n" "$url" "$redirect_count" "$final_url" >> $OUTPUT_FILE
done < "$INPUT_FILE"

echo "检测完成,结果已保存到 $OUTPUT_FILE"

这个脚本的精髓在于用两次curl分别获取两个变量。虽然多一次请求,但胜在逻辑清晰,出问题好排查。如果追求效率,也可以用-w参数一次性输出多个变量。

方案二:高效版——单次请求获取完整跳转链路

用curl -w格式化输出功能,一次请求同时拿url_effective和num_redirects,性能直接翻倍:

#!/bin/bash
# 批量检测跳转链路 - 高效版
INPUT_FILE="urls.txt"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUTPUT_FILE="redirect_report_$TIMESTAMP.csv"

echo "URL,跳转次数,最终地址,HTTP状态码" > $OUTPUT_FILE

while read url; do
  result=$(curl -s -o /dev/null -w "%{http_code},%{num_redirects},%{url_effective}" -L "$url" 2>/dev/null)
  echo "$url,$result" >> $OUTPUT_FILE
done < "$INPUT_FILE"

echo "报告已生成:$OUTPUT_FILE"

输出格式选CSV而不是纯文本,因为CSV可以直接用Excel打开做数据分析。想排序?Excel点一下跳转次数列就行。想看异常行?筛选出跳转次数为0但最终地址和原始URL不一致的,那就有问题了。

方案三:进阶版——带异常告警和链路记录的巡检脚本

生产环境用的脚本不能只输出结果,还得能发现问题、记录日志、甚至自动通知:

#!/bin/bash
# 批量检测跳转链路 - 生产可用版
URL_FILE="urls.txt"
REPORT_DIR="./reports"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
REPORT_FILE="$REPORT_DIR/redirect_audit_$TIMESTAMP.csv"
ALERT_FILE="$REPORT_DIR/redirect_alert_$TIMESTAMP.log"

mkdir -p $REPORT_DIR
echo "URL,跳转次数,最终地址,状态码,耗时(秒),警告" > $REPORT_FILE

while read url; do
  http_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$url")
  redirects=$(curl -s -o /dev/null -w "%{num_redirects}" -L --max-time 30 "$url")
  final_url=$(curl -s -o /dev/null -w "%{url_effective}" -L --max-time 30 "$url")
  time_total=$(curl -s -o /dev/null -w "%{time_total}" -L --max-time 30 "$url")

  alert=""
  if [ "$redirects" -gt 5 ]; then
    alert="跳转次数过多[$redirects]"
  fi
  if [ "$http_code" -ge 400 ]; then
    alert="$alert 原始请求异常[HTTP $http_code]"
  fi
  if [ -z "$alert" ]; then
    alert="正常"
  else
    echo "[告警] $url -> $alert" >> $ALERT_FILE
  fi

  echo "$url,$redirects,$final_url,$http_code,$time_total,$alert" >> $REPORT_FILE
done < "$URL_FILE"

echo "巡检完成!"
echo "完整报告:$REPORT_FILE"
if [ -s "$ALERT_FILE" ]; then
  echo "告警记录:$ALERT_FILE"
  cat $ALERT_FILE
fi

这个方案加入了检测阈值和分批逻辑。跳转超过5次的链路,大概率有中间跳转环节出了问题;原始请求直接返回4xx或5xx,说明这个URL本身可能已经失效了。

URL列表文件怎么写

无论用哪个脚本,都得有个urls.txt作为输入源。常见写法有三种:

  • 每行一个URL:最标准,适合巡检固定列表
  • 从sitemap批量提取:用curl下载sitemap.xml后用grep捞出所有loc标签
  • 从数据库导出:CMS后台导出文章链接,配合awk格式化

建议先用5-10条URL测试脚本是否跑通,确认输出格式正确后再全量跑。批量跑之前先考虑一下目标服务器的承受能力,别把人家打挂了。

怎么用-xargs并行加速

URL列表太长,一条条检测太慢怎么办?用xargs的-P参数可以并行跑:

cat urls.txt | xargs -I {} -P 5 sh -c 'curl -s -o /dev/null -w "{} %{http_code} %{num_redirects} %{url_effective}\n" -L "{}"'

-P 5表示同时跑5个进程,具体数值取决于你的带宽和CPU。如果目标服务器有反爬限流,建议控制在3以内,别太激进。

检测结果怎么看

脚本跑完了,面对一堆数据怎么快速发现问题?记住三个原则:

  • 查数量异常:跳转次数为0但URL变了,说明没用-L参数或者curl没跟上
  • 查地址异常:最终地址指向了不该去的域名或路径
  • 查链路异常:跳转次数远超预期(比如超过3次),逐一排查中间跳

正常情况下,大多数URL的跳转次数应为0或1(HTTPS跳转)。如果发现某个URL跳了7、8次,大概率是重定向循环或者配置出了问题。

从检测到监控:让巡检自动化

检测脚本跑一次不难,难的是坚持跑。建议把这个脚本配置到crontab中定时执行,配合告警通道做到防患于未然。跳转链路异常不一定是坏事,但如果是CDN配置改了、Nginx规则错了、或者第三方链接挂了,早发现就意味着少损失。

总结

批量检测网站跳转链路,核心就是用curl -w的参数组合(url_effective + num_redirects)逐个检测,再通过Shell脚本把结果汇总成可读的报告。从最简的单文件输出到生产级的自动巡检,核心逻辑不变,只是逐步加上性能优化、异常告警、日志轮转等工程化能力。

工具只是工具,真正管用的是你判断异常的眼光。脚本给你数据,你从数据里找规律,这才是巡检的魂。

相关文章推荐

版权声明

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

发表评论