0

curl从sitemap批量提取URL检测重定向链路:3个脚本让全站跳转巡检自动化

2026.06.15 | youres | 2次围观

为什么要从sitemap提取URL做重定向检测

网站运营中,重定向问题是个让人头疼的事。一个链接跳转错了,用户就找不着北,搜索引擎收录也会受影响。手动一条条检查URL太费劲——尤其是网站页面多的时候,几百上千个链接怎么查?

好在sitemap.xml里已经存了你网站的所有公开URL。把这套数据扒下来,用curl批量检测重定向链路,是一个效率极高的方案。一套脚本跑下来,全站跳转状况一目了然。

方法一:curl+sed正则提取sitemap URL并检测重定向

这是最基础也最通用的方法。先用curl下载sitemap.xml,用sed或grep提取出<loc>标签里的URL,再逐个发给curl做重定向检测。

获取sitemap并提取URL列表

curl -s https://example.com/sitemap.xml | sed -n 's:.*<loc>\(.*\)</loc>.*:\1:p' > urls.txt

这条命令干了两件事:用-s静默模式下载sitemap,再用sed正则把每个<loc>标签里的URL提出来,一行一个。

批量检测每条URL的重定向链路

#!/bin/bash
# sitemap_redirect_check.sh
SITEMAP_URL="https://example.com/sitemap.xml"
OUTPUT_FILE="redirect_report.csv"
echo "URL,最终地址,跳转次数,HTTP状态码,耗时(s)" > "$OUTPUT_FILE"
curl -s "$SITEMAP_URL" | sed -n 's:.*<loc>\(.*\)</loc>.*:\1:p' | while read url; do
  result=$(curl -s -o /dev/null -w "%{url_effective},%{num_redirects},%{http_code},%{time_total}" -L "$url")
  echo "$url,$result" >> "$OUTPUT_FILE"
  sleep 0.2
done
echo "检测完成,结果已保存到 $OUTPUT_FILE"

这个脚本逐个读取URL并用-w参数输出最终地址、跳转次数、HTTP状态码和总耗时。结果写入CSV文件,方便用Excel打开分析。

方法二:xargs并行加速批量检测

上面的方法一个一个检测,页面多的时候太慢。用xargs的-P参数可以并行跑多个curl进程,速度翻好几倍。

#!/bin/bash
# sitemap_redirect_parallel.sh - xargs并行加速检测
SITEMAP_URL="https://example.com/sitemap.xml"
OUTPUT_FILE="redirect_parallel_report.csv"
echo "URL,最终地址,跳转次数,HTTP状态码" > "$OUTPUT_FILE"
curl -s "$SITEMAP_URL" | sed -n 's:.*<loc>\(.*\)</loc>.*:\1:p' | \
  xargs -P 10 -I {} sh -c 'curl -s -o /dev/null -w "%{url_effective},%{num_redirects},%{http_code}" -L "{}" 2>/dev/null || echo "请求失败"' \
  >> "$OUTPUT_FILE"
echo "并行检测完成,结果已保存到 $OUTPUT_FILE"

-P 10表示同时跑10个curl进程。根据服务器性能可以调整,一般设10-20比较安全。

方法三:完整巡检脚本——带状态码和耗时分析

对于需要做定期巡检的场景,把状态码、跳转次数、耗时组合在一起检测会更有价值。

#!/bin/bash
# sitemap_full_audit.sh - 全站URL巡检
SITEMAP_URL="https://example.com/sitemap.xml"
REPORT_FILE="site_audit_$(date +%Y%m%d_%H%M%S).csv"
ISSUE_FILE="site_issues_$(date +%Y%m%d_%H%M%S).csv"
echo "URL,最终URL,状态码,跳转次数,总耗时(s),是否有问题" > "$REPORT_FILE"
echo "URL,问题类型" > "$ISSUE_FILE"
curl -s "$SITEMAP_URL" | sed -n 's:.*<loc>\(.*\)</loc>.*:\1:p' | while read url; do
  result=$(curl -s -o /dev/null -w "%{url_effective},%{http_code},%{num_redirects},%{time_total}" -L --max-time 15 "$url" 2>/dev/null)
  if [ $? -ne 0 ]; then
    echo "$url,,请求超时,,是" >> "$REPORT_FILE"
    echo "$url,请求超时" >> "$ISSUE_FILE"
    continue
  fi
  effective_url=$(echo "$result" | cut -d',' -f1)
  http_code=$(echo "$result" | cut -d',' -f2)
  redirects=$(echo "$result" | cut -d',' -f3)
  time_total=$(echo "$result" | cut -d',' -f4)
  issue="否"; issue_type=""
  if [ "$http_code" != "200" ]; then
    issue="是"; issue_type="非200状态码($http_code)"
  elif [ "$redirects" -gt 2 ]; then
    issue="是"; issue_type="跳转次数过多($redirects次)"
  elif (( $(echo "$time_total > 3" | bc -l) )); then
    issue="是"; issue_type="响应时间过长(${time_total}s)"
  fi
  echo "$url,$effective_url,$http_code,$redirects,$time_total,$issue" >> "$REPORT_FILE"
  if [ "$issue" = "是" ]; then echo "$url,$issue_type" >> "$ISSUE_FILE"; fi
  sleep 0.2
done
echo "巡检完成!问题报告: $ISSUE_FILE"

状态码非200、跳转次数超过2次、响应时间超过3秒的URL都会被标记为有问题,方便快速定位需要处理的链接。

处理sitemap索引文件的特殊情况

大型网站的sitemap通常不止一个文件,而是有一个sitemap索引文件,里面指向多个子sitemap。需要先解析索引文件,获得所有子sitemap的地址,再逐个提取URL。

#!/bin/bash
# 处理sitemap索引文件
SITEMAP_INDEX="https://example.com/sitemap_index.xml"
curl -s "$SITEMAP_INDEX" | sed -n 's:.*<loc>\(.*\)</loc>.*:\1:p' > subsitemaps.txt
> all_urls.txt
while read sub_sitemap; do
  curl -s "$sub_sitemap" | sed -n 's:.*<loc>\(.*\)</loc>.*:\1:p' >> all_urls.txt
  sleep 0.5
done < subsitemaps.txt
echo "共提取 $(wc -l < all_urls.txt) 个URL"

三种方案的对比和选择建议

方案一串行检测适合页面100以内的小站点,简单直接。方案二xargs并行适合100-500页的中型站,追求检测速度。方案三完整巡检适合运维场景,自动标记异常URL。

另外要注意sitemap.xml里的URL是网站希望搜索引擎收录的,不一定覆盖所有页面。如果要全面检测全站重定向,还需要把其他来源的URL也加进去。

总结

用curl从sitemap提取URL做重定向检测,本质就是三步:下载sitemap、正则提取URL、curl批量检测。不需要任何额外工具,一台Linux服务器加几行Shell脚本就能搞定。

对于运维人员和SEO从业者来说,定期跑一轮sitemap重定向巡检,能及时发现跳转异常和死链隐患。把脚本配到crontab里,每周自动跑一次,省心又省力。

相关推荐

版权声明

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

发表评论