err_too_many_redirects错误本质是重定向循环,主因包括apache规则缺少协议判断、www与非www双向跳转、动态应用与服务器配置不一致;需用rewritecond %{https} off等守门条件、排除目标域名、同步php与apache的https判断,并通过curl和重写日志定位问题。

Apache 动态应用中出现重定向循环,本质是请求被反复转发而无法落地,浏览器最终报 ERR_TOO_MANY_REDIRECTS。问题通常不在应用代码本身,而是 Apache 配置与后端逻辑(如 PHP、Node.js)之间的协议判断、主机名匹配或状态检查不一致所致。解决关键在于“只在必要时跳转”,并确保每次跳转都向终态靠近一步。
检查重定向触发条件是否完备
很多循环源于规则缺少“守门”条件。例如强制跳 HTTPS 时只判断了端口,却没确认当前是否已是 HTTPS:
- ❌ 错误写法(仅看端口):
RewriteCond %{SERVER_PORT} 80<br>RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
→ 若 HTTPS 站点反向代理到 HTTP 后端(如 Nginx→Apache),Apache 收到的仍是端口 80 请求,就会无限跳转。 - ✅ 正确写法(加协议判断):
RewriteCond %{HTTPS} off<br>RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
或更稳妥地结合代理头:RewriteCond %{HTTP:X-Forwarded-Proto} !https<br>RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
区分 www 与非 www 时避免双向触发
常见陷阱是同时配置了 example.com → www.example.com 和 www.example.com → example.com,或未排除目标域名:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- ❌ 错误示例(无排除):
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]<br>RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
→ 当访问www.example.com时,%{HTTP_HOST}不匹配,但若另一处规则又把www跳回non-www,就形成闭环。 - ✅ 安全写法(明确排除目标):
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]<br>RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
或统一用正则归一化:RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]<br>RewriteCond %{HTTP_HOST} ^(.*\.)?example\.com$ [NC]<br>RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
动态应用(如 PHP)与 Apache 规则协同校验
当 PHP 层也做跳转(如 Laravel 的 forceScheme('https') 或 WordPress 的 FORCE_SSL_ADMIN),需与 Apache 配置对齐:
- 确认 PHP 是否依赖
$_SERVER['HTTPS']或$_SERVER['HTTP_X_FORWARDED_PROTO']判断协议;若 Apache 没传递这些变量,PHP 可能误判并自行跳转,叠加 Apache 规则引发循环。 - 在 Apache 中显式设置:
SetEnvIf X-Forwarded-Proto https HTTPS=on
或在虚拟主机中添加:ProxyPreserveHost On<br>RequestHeader set X-Forwarded-Proto "https" env=HTTPS
- 检查应用配置是否开启“自动重定向”,如 WordPress 的
WP_HOME/WP_SITEURL是否含http://,应统一为https://。
快速定位与验证方法
不靠猜,用工具和日志确认真实流向:
- 用
curl -I http://yoursite.com查看响应头中的Location,观察是否在两个地址间来回跳转; - 启用 Apache 重写日志(临时):
RewriteLogLevel 3<br>RewriteLog "/var/log/apache2/rewrite.log"
(Apache 2.4+ 改用LogLevel alert rewrite:trace3); - 在浏览器开发者工具 Network 标签中查看跳转链,注意每步的 Status Code 和 Redirect URL;
- 禁用所有重定向规则,逐条启用并测试,锁定问题规则。










