0

curl重定向次数超限自动告警脚本:3个方案让异常跳转无处遁形

2026.06.06 | youres | 25次围观

目录

一、为什么要监控重定向次数

网站运营中,重定向是家常便饭。但当跳转链路过长(超过5次甚至10次),用户体验会直线下降,搜索引擎爬取效率也会受影响。更危险的是无限重定向循环,直接导致页面无法访问。

常见导致重定向超限的场景:

  • 短链服务配置错误,多个短链互相指向
  • CDN和源站同时配置了HTTPS跳转,形成死循环
  • nginx rewrite规则写漏条件,导致循环跳转
  • 301和302重定向同时配置,浏览器在两个状态码之间跳来跳去
  • 第三方营销链接参数拼接出错

人工排查效率太低,写一个自动脚本来监控才是正道。

二、curl num_redirects获取跳转次数

curl的-w参数配合num_redirects变量,可以直接拿到重定向次数,不需要解析响应头:

curl -L -s -w '\nnum_redirects: %{num_redirects}\n' -o /dev/null 'https://example.com/check'

解释一下各参数的含义:

  • -L:跟随重定向
  • -s:静默模式,不显示进度条
  • -w '\nnum_redirects: %{num_redirects}\n':单独输出重定向次数
  • -o /dev/null:丢弃响应体,只保留元数据

输出结果类似:

num_redirects: 3

数值正常范围在0到10之间。如果超过阈值(比如5或10),就需要告警。

结合url_effective还能同时拿到最终URL,一起输出方便分析:

curl -L -s -w 'redirects: %{num_redirects}, final_url: %{url_effective}\n' -o /dev/null 'https://example.com/check'

三、方案一:简单Shell脚本检测超限就告警

最基础的方案:写一个Shell脚本,对目标URL检测重定向次数,超限就输出告警信息。

#!/bin/bash
# check_redirect.sh
THRESHOLD=5
URL="$1"
if [ -z "$URL" ]; then
    echo "用法: $0 "
    exit 1
fi
REDIRECT_COUNT=$(curl -L -s -w '%{num_redirects}' -o /dev/null "$URL")
FINAL_URL=$(curl -L -s -w '%{url_effective}' -o /dev/null "$URL")
echo "检测URL: $URL"
echo "重定向次数: $REDIRECT_COUNT"
echo "最终地址: $FINAL_URL"
if [ "$REDIRECT_COUNT" -ge "$THRESHOLD" ]; then
    echo "警告:重定向次数超过阈值($THRESHOLD),请检查!"
    exit 2
fi
echo "正常"
exit 0

使用方式:

bash check_redirect.sh 'https://example.com/marketing-link'

这个脚本简单直接,可以配合crontab定时执行:

*/5 * * * * /opt/scripts/check_redirect.sh 'https://www.yoursite.com/legacy-page' >> /var/log/redirect_check.log 2>&1

每5分钟检查一次,超过阈值就把告警写入日志。

四、方案二:钉钉机器人告警

Shell脚本配合钉钉机器人,才能做到真正的秒级感知。当检测到超限时,自动推送告警到钉钉群。

#!/bin/bash
THRESHOLD=5
URL="$1"
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
REDIRECT_COUNT=$(curl -L -s -w '%{num_redirects}' -o /dev/null "$URL")
FINAL_URL=$(curl -L -s -w '%{url_effective}' -o /dev/null "$URL")
echo "重定向次数: $REDIRECT_COUNT, 最终URL: $FINAL_URL"
if [ "$REDIRECT_COUNT" -ge "$THRESHOLD" ]; then
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    MESSAGE="{\"msgtype\":\"markdown\",\"markdown\":{\"title\":\"重定向告警\",\"text\":\"## 重定向次数超限告警\n\n**检测时间**: $TIMESTAMP\n\n**原始URL**: $URL\n\n**重定向次数**: $REDIRECT_COUNT(阈值: $THRESHOLD)\n\n**最终地址**: $FINAL_URL\n\n请立即检查跳转链路是否存在异常\"}}"
    curl -s -X POST "$WEBHOOK_URL" -H 'Content-Type: application/json' -d "$MESSAGE"
    echo "钉钉告警已发送"
fi

配合crontab使用:

*/5 * * * * /opt/scripts/check_redirect_dingtalk.sh 'https://www.yoursite.com/promo-link' 2>&1 | logger -t redirect_alert

五、方案三:多目标批量巡检加告警

单个URL检测只是起步,实际运营中往往需要批量监控多个URL。写一个配置文件驱动的批量脚本,效率更高。

#!/bin/bash
THRESHOLD=5
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
URL_LIST=(
    "https://example.com/link1"
    "https://example.com/link2"
    "https://short.example.com/abc123"
)
for url in "${URL_LIST[@]}"; do
    info=$(curl -L -s -w '|%{num_redirects}|%{url_effective}' -o /dev/null "$url")
    redirects=$(echo "$info" | awk -F'|' '{print $2}')
    final_url=$(echo "$info" | awk -F'|' '{print $3}')
    echo "[$(date '+%H:%M:%S')] $url -> $redirects 次重定向"
    if [ "$redirects" -ge "$THRESHOLD" ]; then
        echo "告警: $url 重定向次数($redirects)超过阈值($THRESHOLD)"
        TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
        MESSAGE="{\"msgtype\":\"text\",\"text\":{\"content\":\"重定向告警 [$TIMESTAMP] $url 重定向$redirects次,最终地址: $final_url\"}}"
        curl -s -X POST "$WEBHOOK_URL" -H 'Content-Type: application/json' -d "$MESSAGE"
    fi
done

这个脚本可以整合到服务器健康巡检体系里,配合cron定时任务实现24小时监控。

六、总结

curl的num_redirects变量是监控重定向次数的利器。结合Shell脚本可以快速实现:

  • 单URL检测:直接用curl命令行即可
  • 简单告警:配合Shell条件判断,超限输出日志
  • 即时通知:接入钉钉/企业微信机器人,重定向超限秒级推送
  • 批量巡检:URL列表配置化,配合cron定时执行

核心逻辑其实就是一行curl命令,加上简单的条件判断。任何运维场景都能快速复用。

相关推荐

版权声明

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

发表评论