如何配置.htaccess:除某域名所有子域外,全站重定向至HTTPS
解决多站点CMS中特定域名子域跳过HTTPS重定向的问题
嘿,这个问题本质上是调整Rewrite规则的优先级和匹配条件就能搞定的。你原来的规则是全局强制所有流量跳HTTPS,现在只需要先排除目标域名的所有子域,再执行全局重定向就行。
具体配置方案
假设你要排除的是 example.com 的所有子域(比如 sub1.example.com、sub2.example.com 这类),直接把下面的规则放在你的 .htaccess 或者Apache虚拟主机配置的最前面:
# 第一步:排除目标域名的所有子域(含主域名的话看下面的说明) RewriteCond %{HTTP_HOST} \.example\.com$ [NC] RewriteRule ^ - [L] # 第二步:全局HTTPS重定向规则(原来的规则保留) RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
规则细节解释
RewriteCond %{HTTP_HOST} \.example\.com$ [NC]:匹配所有以.example.com结尾的主机名,[NC]是不区分大小写的意思,确保像.Example.Com这类大小写混合的域名也能被正确排除。RewriteRule ^ - [L]:这条规则表示“对匹配到的请求不做任何处理”,[L]是Last的缩写,意思是执行完这条规则就停止后续所有Rewrite规则的处理,直接返回请求——这样就跳过了后面的HTTPS重定向。- 后面的全局重定向规则只会对不满足前面排除条件的域名生效,完美实现你的需求。
进阶调整:只排除子域,主域名仍需重定向
如果你的需求是:example.com 主域名还要继续强制HTTPS,只有它的子域跳过重定向,那把第一条RewriteCond改成下面的正则即可:
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$ [NC]
这个正则的意思是“主机名必须包含至少一个点在 example.com 前面”,也就是匹配所有子域,而 example.com 本身不会被匹配到。
注意事项
- 规则顺序很重要:一定要把排除规则放在全局重定向规则的前面,否则全局规则会先生效,排除规则就没用了。
- 测试用临时重定向:建议先把
[R=301]改成[R=302]来测试,确认配置没问题后再改回301永久重定向——避免浏览器缓存错误的重定向规则,给后续调试添麻烦。 - 和CMS规则的配合:如果你的CMS有自己的Rewrite规则(比如WordPress的 permalink 规则),请把这些HTTPS重定向规则放在CMS规则的最前面,确保优先级最高。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

