Nginx反向代理下Apache的.htaccess重定向出现双www问题排查
问题原因及解决方案
核心原因
你的Apache后端运行在纯HTTP协议下,自身的%{HTTPS}变量永远为off,这直接导致.htaccess里第一个RewriteCond条件%{HTTPS} off恒成立。结合[OR]逻辑,不管当前请求的Host是否带www.,都会触发后续的RewriteRule,在%{HTTP_HOST}前强行添加www.——如果原Host已经是www.example.com,自然就变成了www.www.example.com。
另外,Nginx配置里已经通过Certbot生成的规则完成了HTTP到HTTPS的跳转,Apache侧重复判断HTTPS状态完全多余,反而引发冲突。
修复方案
方案1:简化Apache规则,只处理非www到www的重定向
既然Nginx已经搞定了HTTP→HTTPS的跳转,Apache只需要专注处理域名的www标准化即可,修改.htaccess为:
RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
方案2:保留HTTPS判断(适配复杂场景)
如果必须在Apache侧确认HTTPS状态,要改用Nginx传递的X-Forwarded-Proto请求头来判断(Apache自身的%{HTTPS}无法感知前端Nginx的HTTPS状态):
RewriteEngine On # 通过Nginx传递的头判断是否为HTTPS请求 RewriteCond %{HTTP:X-Forwarded-Proto} !https [OR] # 判断是否不带www前缀 RewriteCond %{HTTP_HOST} !^www\. [NC] # 重定向到HTTPS的www版本,自动避免重复添加www RewriteRule ^ https://www.%{HTTP_HOST#www\.}%{REQUEST_URI} [L,R=301]
这里%{HTTP_HOST#www\.}是Apache的变量替换语法,会自动去掉Host里已有的www.前缀,防止重复拼接。
额外检查项
- 确认Apache已启用
mod_rewrite模块 - 确认Apache站点配置中设置了
AllowOverride All,保证.htaccess规则生效
内容的提问来源于stack exchange,提问作者IMB
相关产品推荐
相关产品推荐

