0

curl批量检测多域名重定向完整链路:3个实战脚本让跳转路径一目了然

2026.06.15 | youres | 6次围观

目录

  • 为什么需要批量检测多域名重定向链路
  • 核心原理:curl -L -w 变量组合
  • 脚本一:批量输出多域名重定向次数和最终URL
  • 脚本二:输出完整跳转链路(每一跳的Location)
  • 脚本三:JSON结构化输出,方便程序解析
  • 性能优化:xargs并行加速
  • 相关阅读

为什么需要批量检测多域名重定向链路

运维巡检、SEO诊断、CDN迁移验证,都绕不开一个问题:一批域名的最终访问地址到底是什么?中间跳了几次?每次跳到哪里?

手动一个个curl太慢,写个批量脚本一次扫完全部域名,结果一目了然。

核心原理:curl -L -w 变量组合

批量检测的核心是把 curl 的两个能力组合起来:

  • -L:跟随重定向
  • -w/--write-out:请求完成后输出指定变量

最关键的几个变量:

变量含义
%{num_redirects}重定向次数
%{url_effective}最终生效URL(跳转终点)
%{http_code}最终HTTP状态码
%{time_total}总耗时(秒)

单条命令示例:

curl -s -L -o /dev/null -w "次数:%{num_redirects} 终点:%{url_effective} 状态码:%{http_code}\n" https://example.com

脚本一:批量输出多域名重定向次数和最终URL

把要检测的域名写进 urls.txt,一行一个:

# urls.txt
https://www.youres.cn
https://httpbin.org/redirect/3
https://baidu.com
https://github.com

批量检测脚本 batch_redirect.sh

#!/bin/bash
while IFS= read -r url; do
  [ -z "$url" ] && continue
  result=$(curl -s -L -o /dev/null \
    -w "次数:%{num_redirects} 终点:%{url_effective} 状态码:%{http_code}" \
    "$url")
  echo "$url => $result"
done < urls.txt

输出效果:

https://www.youres.cn => 次数:0 终点:https://www.youres.cn 状态码:200
https://httpbin.org/redirect/3 => 次数:3 终点:https://httpbin.org/get 状态码:200
https://baidu.com => 次数:1 终点:https://www.baidu.com/ 状态码:200

脚本二:输出完整跳转链路(每一跳的Location)

上面的脚本只看到次数和终点,看不到中间每一跳去了哪。用 -I 逐层打印可以解决这个问题:

#!/bin/bash
url="$1"
max=10
for i in $(seq 1 $max); do
  loc=$(curl -sI "$url" | grep -i "^location:" | awk '{print $2}' | tr -d "\r")
  code=$(curl -sI "$url" | grep -i "HTTP/" | tail -1 | awk '{print $2}')
  echo "第$i跳: $url (状态码:$code)"
  [ -z "$loc" ] && break
  url="$loc"
done

更简洁的做法是用 -L -v 让 curl 自己打印跳转过程:

curl -L -v https://example.com 2>&1 | grep -i "location:"

脚本三:JSON结构化输出,方便程序解析

巡检结果要入库或传给监控平台,JSON 格式最方便。配合 jq 可以做到:

#!/bin/bash
while IFS= read -r url; do
  [ -z "$url" ] && continue
  data=$(curl -s -L -o /dev/null \
    -w "%{num_redirects},%{url_effective},%{http_code},%{time_total}" \
    "$url")
  IFS=',' read -r redirects final_url http_code time_total <<< "$data"
  jq -n \
    --arg url "$url" \
    --argjson redirects "$redirects" \
    --arg final_url "$final_url" \
    --arg http_code "$http_code" \
    --arg time_total "$time_total" \
    '{url:$url,redirects:$redirects,final_url:$final_url,http_code:$http_code,time_total:($time_total|tonumber)}'
done < urls.txt

性能优化:xargs并行加速

域名多的时候,串行检测太慢。用 xargs -P 并行跑,速度提升明显:

cat urls.txt | xargs -P 10 -I {} bash -c \
  'result=$(curl -s -L -o /dev/null -w "%{num_redirects} %{url_effective} %{http_code}" "{}"); echo "{} => $result"'

-P 10 表示最多并发10个进程,根据服务器负载调整。

相关阅读

版权声明

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

发表评论