.htaccess访问根域名出现www无限叠加循环重定向故障
问题原因
故障由两个配置缺陷共同导致:
- HTTPS强制跳转逻辑不兼容通用部署架构
现在绝大多数站点会前置CDN、Nginx反向代理做HTTPS卸载,TLS握手在代理层完成,代理回源到Apache时走HTTP协议,这种场景下Apache读取的%{HTTPS}变量永远是off,导致每条请求都会触发HTTPS跳转,形成重定向循环。
而www前缀无限叠加的问题,是因为访问根路径时触发了Apache mod_dir模块的目录规范化(自动补全目录尾部斜杠)逻辑,该逻辑在跳转循环中错误拼接Host头,加上301永久跳转的强缓存特性,最终出现www前缀重复叠加的异常。 - 路由规则未覆盖根路径
你写的路由匹配正则是^/?(\w+)/?$,要求路径至少包含1个字母/数字/下划线字符,访问根路径/时完全无法命中规则,Apache会直接处理目录请求,触发上述mod_dir的跳转逻辑,和错误的HTTPS跳转形成连锁反应。
修复后的配置
直接替换原有.htaccess内容即可:
RewriteEngine On # 兼容代理/CDN场景的HTTPS跳转,避免循环 RewriteCond %{HTTPS} !on RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC] RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,NE,L] # 单独处理根路径路由,可根据你的实际首页路由修改route值 RewriteRule ^/?$ index.php?route=home [QSA,L] # 原有单段路径路由规则 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/?(\w+)/?$ index.php?route=$1 [QSA,L]
验证注意事项
- 替换配置后必须先清理浏览器缓存:301是永久重定向,浏览器会长期缓存错误的跳转记录,不清理会持续复现旧问题。测试阶段可以先把跳转规则里的
R=301改成R=302(临时重定向),确认跳转逻辑正常后再改回301。 - 如果是Apache直接对外提供HTTPS服务、没有前置代理,需要检查对应虚拟主机配置:确保
ServerName准确设置为www.mydomain.com,同时添加UseCanonicalName Off配置,禁止Apache自行拼接构造域名。 - 根路径对应的
route=home参数可以根据你项目实际的首页路由标识调整。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

