0

Shell脚本curl重定向异常告警配置:5个实战方案让网站问题无处遁形

2026.06.05 | youres | 24次围观

网站运维最头疼的事是什么?半夜被电话叫起来说网站挂了,打开一看发现是重定向异常导致的。这时候如果能提前收到告警,就能在用户投诉前解决问题。

curl命令配合Shell脚本可以实现重定向异常自动告警,今天分享5个实战方案,让你的网站监控更智能。

方案一:重定向次数超限告警

使用curl的-w参数输出重定向次数,超过阈值就触发告警。

#!/bin/bash
# 监控重定向次数
URL=$1
MAX_REDIRECTS=${2:-3}

# 获取重定向次数
result=$(curl -s -L -o /dev/null -w %{num_redirects} $URL)
echo 重定向次数: $result

if [ $result -gt $MAX_REDIRECTS ]; then
    # 发送告警
    curl -s https://api.example.com/alert?msg=重定向次数异常:$result > /dev/null
    echo 告警已发送
fi

这个脚本很简单,但很实用。通过-w参数获取num_redirects变量,判断重定向次数是否超过阈值。

告警逻辑说明

  • 正常情况:重定向次数在预期范围内(比如1-3次)
  • 异常情况:重定向次数过多,可能存在循环或配置错误
  • 触发条件:次数超过阈值立即告警

方案二:重定向终点异常告警

检测重定向后的最终URL是否符合预期,不符合就告警。

#!/bin/bash
# 监控重定向终点
URL=$1
EXPECTED_DEST=${2:-https://www.example.com}

# 获取最终URL
final_url=$(curl -s -L -o /dev/null -w %{url_effective} $URL)
echo 最终URL: $final_url

if [ $final_url != $EXPECTED_DEST ]; then
    # 发送告警
    curl -s https://api.example.com/alert?msg=重定向终点异常:$final_url > /dev/null
    echo 告警已发送
fi

这个方案特别适合监控HTTPS强制跳转和域名迁移场景。如果原本应该跳转到HTTPS,结果还停留在HTTP,说明配置出了问题。

适用场景

  • HTTP到HTTPS强制跳转验证
  • 域名迁移后跳转检测
  • 短链服务监控
  • CDN回源跳转检查

方案三:重定向状态码异常告警

监控重定向使用的状态码,301、302、307、308各有用途,用错了可能导致问题。

#!/bin/bash
# 监控重定向状态码
URL=$1

# 获取第一跳响应码
first_code=$(curl -s -I $URL | grep -i ^HTTP | head -1 | awk {print $2})
# 获取最终响应码
final_code=$(curl -s -L -o /dev/null -w %{http_code} $URL)

echo 第一跳状态码: $first_code
echo 最终状态码: $final_code

# 检查重定向状态码
if [[ $first_code == 301 || $first_code == 302 ]]; then
    echo 检测到重定向,状态码: $first_code
elif [[ $first_code == 307 || $first_code == 308 ]]; then
    echo 检测到重定向,状态码: $first_code
elif [[ $first_code =~ ^3[0-9][0-9]$ ]]; then
    curl -s https://api.example.com/alert?msg=异常重定向状态码:$first_code > /dev/null
fi

状态码选择很重要,用302代替301可能导致SEO权重不传递,用301代替307会导致POST参数丢失。

方案四:重定向耗时异常告警

重定向本身也有性能开销,跳转太多或太慢会影响用户体验。

#!/bin/bash
# 监控重定向耗时
URL=$1
MAX_TIME=${2:-2}

# 获取重定向耗时
redirect_time=$(curl -s -L -o /dev/null -w %{time_redirect} $URL)
total_time=$(curl -s -L -o /dev/null -w %{time_total} $URL)

echo 重定向耗时: ${redirect_time}s
echo 总耗时: ${total_time}s

# 使用bc进行浮点数比较
if (( $(echo $redirect_time > $MAX_TIME | bc -l) )); then
    curl -s https://api.example.com/alert?msg=重定向耗时过长:${redirect_time}s > /dev/null
    echo 告警已发送
fi

time_redirect变量记录的是所有重定向的总耗时。如果这个值过高,说明跳转链路有问题。

性能优化建议

  • 减少不必要的重定向层级
  • 使用CDN加速重定向响应
  • 避免跨域名重定向(需要额外DNS查询)
  • 检查后端应用重定向逻辑性能

方案五:批量检测告警脚本

把以上检测整合成一个批量监控脚本,适合定时任务执行。

#!/bin/bash
# 批量重定向异常检测告警脚本

URL_FILE=$1
LOG_FILE=/var/log/redirect_check.log
ALERT_API=https://api.example.com/alert

while IFS= read -r url; do
    # 跳过空行和注释
    [[ -z $url || $url == \#* ]] && continue
    
    # 获取各项指标
    num_redirects=$(curl -s -L -o /dev/null -w %{num_redirects} $url)
    final_url=$(curl -s -L -o /dev/null -w %{url_effective} $url)
    redirect_time=$(curl -s -L -o /dev/null -w %{time_redirect} $url)
    
    # 记录日志
    echo $(date +%Y-%m-%d\ %H:%M:%S) $url redirects=$num_redirects time=${redirect_time}s final=$final_url >> $LOG_FILE
    
    # 异常判断
    if [ $num_redirects -gt 5 ]; then
        curl -s ${ALERT_API}?msg=${url}重定向次数过多:${num_redirects} > /dev/null
    fi
    
    if (( $(echo $redirect_time > 3 | bc -l) )); then
        curl -s ${ALERT_API}?msg=${url}重定向耗时过长:${redirect_time}s > /dev/null
    fi
    
    sleep 1
done < $URL_FILE

这个脚本会逐个检测URL列表中的地址,记录日志并发送告警。配合crontab定时执行,实现自动化监控。

告警渠道选择

检测到异常后,需要及时通知运维人员。常见的告警渠道有:

  • 邮件告警:最传统,但可能被淹没在垃圾邮件中
  • 钉钉/企业微信:实时性好,支持@指定人
  • 短信告警:紧急问题的最佳选择
  • Webhook:可以对接到自己的告警平台

建议根据严重程度选择不同渠道,比如短信用于紧急问题,钉钉用于一般告警。

定时任务配置

把检测脚本配置到crontab,实现自动化监控:

# 每5分钟检测一次
*/5 * * * * /opt/scripts/check_redirects.sh /opt/scripts/urls.txt

# 每小时检测一次(非紧急URL)
0 * * * * /opt/scripts/check_redirects.sh /opt/scripts/urls_low_priority.txt

根据URL的重要性调整检测频率,核心业务5分钟一次,次要业务可以放宽到30分钟或1小时。

总结

curl配合Shell脚本实现重定向异常告警,核心是利用-w参数输出各项指标。5个方案各有侧重:

  • 方案一关注重定向次数,防止循环跳转
  • 方案二关注重定向终点,确保跳转正确
  • 方案三关注状态码,避免SEO和参数问题
  • 方案四关注性能,提升用户体验
  • 方案五是批量整合方案,适合生产环境

根据你的实际需求选择合适的方案,或者组合使用。监控做好了,才能睡个安稳觉。

版权声明

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

发表评论