2026.06.06 | youres | 25次围观
目录
- 一、为什么要监控重定向次数
- 二、curl num_redirects获取跳转次数
- 三、方案一:简单Shell脚本检测超限就告警
- 四、方案二:钉钉机器人告警
- 五、方案三:多目标批量巡检加告警
- 六、总结与内链推荐
一、为什么要监控重定向次数
网站运营中,重定向是家常便饭。但当跳转链路过长(超过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辅助作者原创,未经许可,转载请保留原文链接。

发表评论