Apache重定向跳转到www仅省略https时生效的故障排查求助
Apache重定向规则问题排查及修复方案
核心问题定位
你当前的重定向规则存在3个明显错误:
- 逻辑运算符使用错误:3个RewriteCond全部用
[OR]连接,判断逻辑完全不符合预期 - 匹配条件冗余:第一个规则
%{HTTP_HOST} !^www\.example\.com [NC]已经覆盖了example.com的匹配场景,第二个规则完全多余 - 协议判断依赖错误:直接使用
X-Forwarded-Proto判断请求协议,仅适用于站点部署在反向代理/CDN后的场景,Apache直接对外服务时该字段默认不存在,会导致协议判断完全失效
异常现象原因解释
访问https://example.com失败的原因:
- 请求到达Apache前,如果你的
example.com未包含在HTTPS证书的SAN列表中,或者Apache未配置443端口的example.com虚拟主机,会直接触发证书错误/连接拒绝,表现为访问失败 - 即使请求能到达重定向规则,由于
example.com命中第一个RewriteCond(非www开头的域名),会直接触发重定向,若此时存在证书问题,跳转过程也会失败 - 而
http://example.com走80端口请求,不会触发证书校验,重定向规则可正常执行跳转到https://www.example.com,所以看起来访问正常
修复后的规则
根据你的部署场景二选一即可:
场景1:站点部署在CDN/反向代理之后
RewriteCond %{HTTP:X-Forwarded-Proto} !https [OR] RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] RewriteRule ^(.*)$ https://www.example.com%{REQUEST_URI} [L,R=301]
场景2:Apache直接对外提供服务
RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] RewriteRule ^(.*)$ https://www.example.com%{REQUEST_URI} [L,R=301]
验证注意事项
- 修改配置前先确认你的HTTPS证书同时覆盖
example.com和www.example.com - 配置修改后先执行
apachectl configtest验证配置合法,再执行apachectl graceful重载服务 - 测试时使用浏览器无痕模式,避免301永久重定向的本地缓存干扰验证结果
内容的提问来源于stack exchange,提问作者PelleLV
相关产品推荐
相关产品推荐

