如何让强制HTTPS的rewrite规则不影响所有子域名
问题根源
你当前的配置存在两处全局生效的规则,导致所有子域名都会被强制升级HTTPS:
- 末尾的
RewriteCond %{HTTPS} !=on规则没有限定匹配域名,所有访问该服务的域名都会触发跳转 - 全局设置的CSP、HSTS等响应头没有做域名限制,所有子域名的响应都会带上这些头
修改后的配置
RewriteEngine on # 原有多域名跳转到example.kiwi的规则保留不变 RewriteCond %{HTTP_HOST} ^www\.example\.kiwi$ [OR] RewriteCond %{HTTP_HOST} ^example\.nz$ [OR] RewriteCond %{HTTP_HOST} ^www\.example\.nz$ RewriteRule ^/?$ "https://example.kiwi/$1" [R=301,L] RewriteCond %{HTTP_HOST} ^example\.app$ [OR] RewriteCond %{HTTP_HOST} ^www\.example\.app$ RewriteRule ^/?$ "https://example.kiwi/$1" [R=301,L] RewriteCond %{HTTP_HOST} ^example\.online$ [OR] RewriteCond %{HTTP_HOST} ^www\.example\.online$ RewriteRule ^/?$ "https://example.kiwi/$1" [R=301,L] RewriteCond %{HTTP_HOST} ^example\.software$ [OR] RewriteCond %{HTTP_HOST} ^www\.example\.software$ RewriteRule ^/?$ "https://example.kiwi/$1" [R=301,L] # 仅对指定域名启用HTTP转HTTPS跳转,排除其他子域名 RewriteCond %{HTTPS} !=on RewriteCond %{HTTP_HOST} ^(www\.)?example\.(kiwi|nz|app|online|software)$ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] # 仅对指定域名设置安全响应头 <If "%{HTTP_HOST} =~ /^(www\.)?example\.(kiwi|nz|app|online|software)$/"> Header always set Content-Security-Policy "upgrade-insecure-requests;" Header always setifempty Strict-Transport-Security "max-age=31536000" env=HTTPS Header append X-Frame-Options: "SAMEORIGIN" </If>
修改说明
- 给HTTPS跳转规则新增了域名匹配条件,只有你列出的几个主域名和对应www子域名会触发跳转,mail等其他子域名完全不会匹配该规则
- 用
<If>指令给安全头做了域名限定,只有指定域名的响应才会携带CSP、HSTS等头,不会影响其他子域名的头配置 - 修改后记得清理浏览器缓存再测试,避免之前的301永久重定向缓存干扰验证
内容的提问来源于stack exchange,提问作者Rohit Gupta
相关产品推荐
相关产品推荐

