err_too_many_redirects本质是重定向循环,需切断链路、明确触发条件、避免多层配置重复处理;关键措施包括:统一跳转入口、显式匹配http_host、禁用redirect改用rewritecond、清理查询字符串与斜杠冲突,并用curl-i逐级验证跳转链。

Apache 中 301 重定向次数过多(ERR_TOO_MANY_REDIRECTS)本质是请求在多个跳转规则间循环,浏览器达到上限后中断。关键不是“少设几条”,而是切断循环链路、明确触发条件、避免规则自干扰。
检查并隔离重定向作用域
同一请求被多个配置层重复处理,是最常见原因:
- 确认是否同时在
.htaccess、虚拟主机配置(VHost)、主配置(httpd.conf)中写了针对相同路径的 301 规则——删掉冗余层,只保留一处生效 - 若用了子域名(如
blog.example.com)且其根目录在主站子目录下(如/var/www/html/blog/),确保子域名的.htaccess不继承或重复执行主站规则;可在子站目录中加RewriteEngine Off或用RewriteCond %{HTTP_HOST}显式限定仅匹配主域名 - 使用
Include引入外部规则文件时,检查是否被多次包含(例如在VHost和Directory块中都写了Include)
禁止跨协议/跨域规则互相触发
比如主站跳 HTTPS + www,但子站也配了跳 HTTPS,就容易套娃:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 所有域名跳转规则必须显式匹配
HTTP_HOST,且目标 URL 写完整协议+域名,例如:RewriteCond %{HTTP_HOST} ^example\.com$ [NC]<br>RewriteRule ^(.*)$ https://www.example.com$1 [R=301,L]
不能写成https://$1或省略https:// - 若需强制 HTTPS,统一在入口处做(如只在
VHost:80中跳转到443),不要在443的配置里再写跳 HTTPS - 主域名跳子域名时,禁用
Redirect指令(它不识别 Host),改用RewriteCond %{HTTP_HOST}判断,否则子域名访问也会被拉回主站
清理查询字符串与尾部斜杠冲突
看似无关的操作,常引发二次跳转:
- 旧链接带参数(如
?ref=abc)而新地址未清除,又没加结尾?,会导致跳转后 URL 叠加两次参数;规则末尾务必加?(如/new-path? [R=301,L]) - 旧路径无尾部斜杠(
/old)、新路径有(/new/),Apache 默认会补斜杠并再触发一次跳转;统一风格:要么都带/,要么都不带,并在规则中严格匹配(如用^/old/?$) - 避免用
RedirectMatch匹配宽泛路径(如^/.*$),它可能误中重定向后的 URL,造成循环
上线前必须做的验证动作
靠肉眼读规则很难发现隐性循环:
- 用
curl -I测试原始 URL,看响应头中的Location是否指向预期地址,且状态码是301;再对返回的Location地址继续curl -I,确认不再跳转 - 浏览器测试务必用无痕窗口,或清空 DNS 和重定向缓存(301 缓存极顽固)
- 临时把所有
R=301改成R=302,观察跳转链是否收敛;确认无误后再切回 301










