.htaccess配置问题:主域名https://example.com未跳转至https://www.example.com
解决.htaccess中主域名https://example.com无法重定向到带www版本的问题
首先,你的需求非常清晰:要让裸域名example.com强制跳转到https://www.example.com,所有子域名(不管带不带www)强制跳转到非www的HTTPS版本,而且因为通配符证书*.example.com不覆盖裸域名,所以必须确保裸域名的跳转逻辑绝对可靠。
现有配置的问题分析
你当前的配置存在两个关键问题,导致https://example.com无法正常跳转:
规则逻辑的优先级与冲突隐患
虽然你写了主域名的跳转规则,但它的位置在子域名规则之后,而且依赖OR条件判断。当访问https://example.com时,HTTPS已经开启,%{HTTPS} !=on这个条件不成立,虽然OR后面的%{HTTP_HOST} ^example\.com$条件成立,但在某些服务器环境下(比如反向代理场景),%{HTTPS}的取值可能不是标准的on,会导致整个条件的逻辑判断出现偏差,从而跳过跳转规则。子域名规则的条件不够精准
第一个规则中的RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$ [NC]虽然试图排除主域名,但正则的匹配范围太宽泛,加上后续的^(?:www\.|)(.*)$捕获规则,可能会在某些边缘场景下干扰主域名的跳转逻辑。
修正后的配置方案
我调整了规则顺序和条件,让逻辑更清晰、更可靠,完全覆盖你的需求:
RewriteEngine On # 1. 优先处理裸域名:强制跳转到带www的HTTPS版本 # 不管当前协议是HTTP还是HTTPS,只要主机名是example.com就触发跳转 RewriteCond %{HTTP_HOST} ^example\.com$ [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] # 2. 强制所有请求使用HTTPS # 确保所有未加密的请求(包括主域名www和子域名)都跳转到HTTPS RewriteCond %{HTTPS} !=on # 如果你的服务器在反向代理(如Cloudflare、Nginx)后面,请替换上面的条件为: # RewriteCond %{HTTP:X-Forwarded-Proto} !=https RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] # 3. 处理子域名的www前缀:强制去掉www,跳转到非www的HTTPS版本 # 仅匹配带www前缀的子域名(如www.sub.example.com),避免影响主域名 RewriteCond %{HTTP_HOST} ^www\.(.*\.example\.com)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
配置解释
- 第一部分:这是最关键的一步,专门针对裸域名
example.com,不管当前是HTTP还是HTTPS,直接跳转到https://www.example.com。规则优先级最高,确保不会被其他规则干扰。 - 第二部分:全局强制HTTPS,确保所有未使用HTTPS的请求都被加密,覆盖主域名和子域名的所有场景。如果服务器在反向代理后面,记得替换条件,因为反向代理会把HTTPS请求转发给Apache时,
%{HTTPS}可能还是off。 - 第三部分:精准匹配带www前缀的子域名,去掉www后跳转到对应的非www版本,完全符合你的子域名需求。
测试注意事项
因为301是永久重定向,浏览器会缓存跳转规则,所以测试时建议使用浏览器的隐私模式,或者清除浏览器缓存后再测试,避免旧缓存影响结果。
内容的提问来源于stack exchange,提问作者Szymon Zielonka
相关产品推荐
相关产品推荐

