前言
网站运维中,定期检查重定向链路是避免流量流失和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直接打开可能乱码。两个解决办法:
- 脚本开头输出BOM头:
printf '\xEF\xBB\xBF' > "$OUTPUT" - 用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辅助作者原创,未经许可,转载请保留原文链接。

发表评论