.htaccess配置异常:http://www.example.com无法跳转至HTTPS
解决HTTP到HTTPS及非www到www的统一跳转问题
我来帮你搞定这个跳转问题!你的.htaccess配置里有个小bug,导致http://www.example.com无法正确跳转到HTTPS——当请求是带www的HTTP地址时,第二个规则会错误地在域名前再添加一个www.,最终生成https://www.www.example.com这种无效地址,浏览器自然不会正确跳转。
修正后的.htaccess配置
直接替换成下面的代码,就能实现所有请求(不管是http://example.com还是http://www.example.com)统一跳转到https://www.example.com:
RewriteBase / RewriteEngine on # 统一跳转至 https://www.example.com # 条件:要么请求不是HTTPS(适配AWS环境的X-Forwarded-Proto头),要么域名不带www RewriteCond %{HTTP:X-Forwarded-Proto} !https [OR] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] # 静态文件/目录直接访问,不转发到后端(保留你原来的规则) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [L]
关键修正点说明
- 合并跳转逻辑:用
[OR]连接两个条件,只要请求是HTTP协议,或者域名不带www,就触发跳转,避免了多次跳转的问题。 - 固定跳转目标:直接写死目标地址
https://www.example.com/$1,彻底避免了%{HTTP_HOST}带来的重复www问题。 - 适配AWS环境:依然用
X-Forwarded-Proto判断真实请求协议,因为AWS的负载均衡/CloudFront通常会在前端处理SSL,后端服务器拿到的是HTTP请求,这个头能帮我们识别用户实际用的是HTTP还是HTTPS。
额外注意事项
- 修改完配置后,一定要清除浏览器缓存或者用隐私模式测试,因为301永久跳转是会被浏览器缓存的,之前的错误跳转记录可能还在生效。
- 确认AWS环境中已经正确传递
X-Forwarded-Proto头:如果用的是ELB,要在负载均衡的监听配置里开启“转发客户端IP和HTTP头”;如果是CloudFront,要在行为设置中确保X-Forwarded-Proto头被转发到源站。
内容的提问来源于stack exchange,提问作者Param Singh
相关产品推荐
相关产品推荐

