网站运维最头疼的事是什么?半夜被电话叫起来说网站挂了,打开一看发现是重定向异常导致的。这时候如果能提前收到告警,就能在用户投诉前解决问题。
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辅助作者原创,未经许可,转载请保留原文链接。

发表评论