使用.htaccess将www及HTTP重定向至非www HTTPS的问题咨询
你的配置接近目标,但漏掉了HTTPS下的www重定向
首先直接给结论:你不需要把%{REQUEST_URL}替换成example.com,不过你的当前配置没有处理HTTPS协议下的www子域名跳转(比如https://www.example.com不会被重定向到https://example.com),这是需要补充的核心部分。
先拆解你的现有规则:
- 第一条条件
%{HTTPS} off只针对HTTP协议的请求,所以当用户访问https://www.example.com时,这条规则不会触发,也就无法完成跳转。 %{HTTP_HOST} ^(?:www\.)?(.*)$这个正则是对的,它会把www.example.com或example.com捕获为example.com(存到%1变量)。%{REQUEST_URL}其实包含了请求的路径和查询字符串,用它是没问题的,但更规范的写法是使用RewriteRule捕获的$1(也就是你规则里的(.*)),效果完全一致。
完整的正确配置
把你的.htaccess更新为以下内容,就能覆盖所有目标场景的跳转:
RewriteEngine On # 处理HTTP协议的请求:跳转到HTTPS+非www RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^(?:www\.)?(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [L,R=301] # 处理HTTPS协议下的www请求:跳转到非www的HTTPS RewriteCond %{HTTPS} on RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [L,R=301]
配置说明
- 第一组规则:针对所有HTTP请求(不管带不带www),直接重定向到对应的HTTPS非www地址,同时完整保留原请求的路径和参数。
- 第二组规则:针对HTTPS但带www的请求,去掉www前缀,重定向到非www的HTTPS地址,同样保留原路径和参数。
另外两个小提示:
- 301是永久重定向,配置生效前建议先改用
R=302(临时重定向)测试,确保规则逻辑正确后再换回301,避免浏览器缓存错误的重定向规则。 [NC]标记表示匹配主机名时不区分大小写,能保证WWW.EXAMPLE.COM这类大写域名也能被正确处理。
内容的提问来源于stack exchange,提问作者WoffeLL
相关产品推荐
相关产品推荐

