.htaccess配置疑难:如何将所有域名访问重定向至https://www.example.com?
解决.htaccess中example.com重定向至错误URL的问题
异常原因分析
你遇到的问题核心在于原配置只实现了HTTP到HTTPS的强制跳转,却没有处理裸域(example.com)到带www域名(www.example.com)的规范化跳转,再加上浏览器/服务器的异常解析行为,最终导致了错误的跳转地址:
当你直接在地址栏输入example.com时,浏览器默认会发起HTTP请求。如果服务器DNS或虚拟主机配置存在细微异常,可能会导致%{HTTP_HOST}被错误解析为www.example.com,同时%{REQUEST_URI}被意外填充了原请求的完整URL(比如http://www.example.com/)。原配置中的规则会将这两个变量拼接成https://www.example.com/http://www.example.com/,自然就会出现“URL未找到”的错误。
至于你疑惑的「为什么https://example.com可以正确跳转」,大概率是浏览器的301缓存在起作用——之前可能存在过正确的www跳转规则,浏览器缓存了该重定向;或者服务器在虚拟主机层面(而非.htaccess)配置了HTTPS下的裸域跳转规则,刚好覆盖了这个场景。
修改后的.htaccess配置方案
我们需要同时实现两个目标:强制HTTPS、将裸域规范化为带www的域名。推荐使用以下配置,覆盖所有访问场景:
RewriteEngine On DirectoryIndex html/home5.html RewriteRule ^\.htaccess$ - [F] # 规则1:将裸域(无论HTTP/HTTPS)跳转至带www的HTTPS地址 RewriteCond %{HTTP_HOST} ^example\.com$ [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301] # 规则2:将www域名的HTTP请求跳转至HTTPS RewriteCond %{HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
配置说明
- 第一条规则专门针对裸域
example.com,无论用户用HTTP还是HTTPS访问,都会直接跳转到https://www.example.com加上原路径,一步完成域名规范化和HTTPS强制。 - 第二条规则则处理
www.example.com的HTTP请求,确保所有带www的访问都强制使用HTTPS。 [L,R=301]中的L表示这是最后一条规则,匹配后不再执行后续规则;R=301表示永久重定向,利于搜索引擎收录。
额外注意事项
修改配置后,建议清除浏览器缓存再测试,避免旧的301缓存影响结果。如果服务器有CDN或反向代理,也需要同步清除CDN缓存,确保新规则生效。
内容的提问来源于stack exchange,提问作者Silas
相关产品推荐
相关产品推荐

