0

curl检测重定向次数并输出CSV:3个Shell脚本方案让网站巡检数据自动归档

2026.06.15 | youres | 4次围观

前言

网站运维中,定期检查重定向链路是避免流量流失和SEO问题的基本功。如果你管理的域名不止一个,逐个手动敲curl命令显然不现实。本文教你用curl的-w参数配合Shell脚本,批量检测重定向次数并自动输出CSV报告,让巡检工作一步到位。

核心知识点:curl重定向检测的两个关键变量

在开始写脚本之前,先搞清楚两个最重要的-w变量:

  • %{num_redirects} — 请求过程中发生的服务器端重定向次数
  • %{url_effective} — 跟随所有重定向后最终到达的URL

这两个变量配合-L(跟随重定向)参数使用,就能完整获取一条URL的跳转链路信息。基础命令模板如下:

curl -sL -o /dev/null -w "%{num_redirects},%{url_effective}" https://example.com

输出格式:跳转次数,最终URL。比如2,https://final.example.com/page就表示经历了2次重定向。

方案一:最简脚本,逐行读取URL列表输出CSV

适合URL数量不多(几十个以内)的场景,脚本逻辑最清晰。

#!/bin/bash
# redirect_csv.sh - 批量检测重定向次数输出CSV
INPUT="urls.txt"
OUTPUT="redirect_report.csv"

echo "URL,重定向次数,最终URL,状态码" > "$OUTPUT"

while IFS= read -r url; do
  [ -z "$url" ] && continue
  result=$(curl -sL -o /dev/null -w "%{num_redirects}|%{url_effective}|%{http_code}" --max-time 10 "$url")
  redirects=$(echo "$result" | cut -d'|' -f1)
  final_url=$(echo "$result" | cut -d'|' -f2)
  status=$(echo "$result" | cut -d'|' -f3)
  echo "$url,$redirects,$final_url,$status" >> "$OUTPUT"
done < "$INPUT"

echo "报告已生成: $OUTPUT"

使用方法:把待检测的URL一行一个写入urls.txt,运行脚本后自动生成带表头的CSV文件。用Excel或WPS打开即可查看。

方案二:xargs并行加速,适合大规模批量检测

当URL列表上百条甚至更多时,逐个串行检测太慢。利用xargs -P实现并行请求,效率能提升数倍。

#!/bin/bash
# redirect_parallel.sh - 并行批量检测重定向输出CSV
INPUT="urls.txt"
OUTPUT="redirect_report.csv"
PARALLEL=5

echo "URL,重定向次数,最终URL,状态码" > "$OUTPUT"

check_url() {
  local url="$1"
  local result
  result=$(curl -sL -o /dev/null -w "%{num_redirects}|%{url_effective}|%{http_code}" --max-time 10 "$url" 2>/dev/null)
  echo "$url,$result" | tr '|' ','
}

export -f check_url
cat "$INPUT" | grep -v '^$' | xargs -P "$PARALLEL" -I {} bash -c 'check_url "$@"' _ {} >> "$OUTPUT"

echo "并行检测完成: $OUTPUT"

通过修改PARALLEL变量的值控制并发数。建议不超过20,避免对目标服务器造成过大压力。

方案三:带异常高亮的高级检测脚本

运维巡检不仅要出数据,还要快速定位问题。这个方案在输出CSV的同时标记异常项。

#!/bin/bash
# redirect_alert.sh - 批量检测重定向并标记异常
INPUT="urls.txt"
OUTPUT="redirect_report.csv"
WARN_FILE="redirect_warnings.txt"

echo "URL,重定向次数,最终URL,状态码,状态" > "$OUTPUT"
> "$WARN_FILE"

while IFS= read -r url; do
  [ -z "$url" ] && continue
  result=$(curl -sL -o /dev/null -w "%{num_redirects}|%{url_effective}|%{http_code}" --max-time 10 "$url" 2>/dev/null)
  redirects=$(echo "$result" | cut -d'|' -f1)
  final_url=$(echo "$result" | cut -d'|' -f2)
  status=$(echo "$result" | cut -d'|' -f3)

  flag="正常"
  # 异常判定规则
  if [ "$status" -ne 200 ]; then
    flag="异常-状态码$status"
    echo "[警告] $url 返回状态码 $status" >> "$WARN_FILE"
  elif [ "$redirects" -gt 3 ]; then
    flag="警告-重定向过多"
    echo "[警告] $url 重定向${redirects}次" >> "$WARN_FILE"
  elif [ "$redirects" -eq 0 ] && [ "$final_url" != "$url" ]; then
    flag="警告-num_redirects为0但URL变化"
    echo "[警告] $url num_redirects为0但url_effective不同" >> "$WARN_FILE"
  fi

  echo "$url,$redirects,$final_url,$status,$flag" >> "$OUTPUT"
done < "$INPUT"

echo "检测完成,报告: $OUTPUT"
[ -s "$WARN_FILE" ] && echo "发现异常,详情: $WARN_FILE" || echo "全部正常"

使用技巧和常见问题

CSV文件Excel打开乱码怎么办?

Linux下生成的CSV默认是UTF-8编码,Excel直接打开可能乱码。两个解决办法:

  1. 脚本开头输出BOM头:printf '\xEF\xBB\xBF' > "$OUTPUT"
  2. 用Excel的"数据 → 从文本导入"功能指定UTF-8编码打开

num_redirects输出0但确实发生了重定向?

这种情况通常出现在以下场景:

  • 没有加-L参数,curl不跟随重定向,num_redirects自然为0
  • 重定向发生在客户端(JavaScript跳转),curl无法感知
  • CDN或负载均衡层的302跳转在某些版本curl中有统计差异

解决方法:始终确保加上-L参数,并用--max-time设置超时避免卡死。

如何把检测纳入定时巡检?

配合crontab实现自动化。例如每天早上8点执行一次:

0 8 * * * /opt/scripts/redirect_alert.sh >> /var/log/redirect_check.log 2>&1

加上日志轮转配置,长期运行的巡检脚本也不会产生过大的日志文件。

总结

批量检测重定向并输出CSV,本质上就是把curl -w的变量输出能力包装进循环或并行脚本里。三个方案从简单到复杂,覆盖了日常巡检的大部分需求。关键是选对方案——URL少用方案一,URL多用方案二,需要异常告警用方案三。脚本写好后配合crontab定时执行,网站重定向问题就再也不会悄悄发生而无人知晓了。

相关文章

版权声明

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

发表评论