使用.htaccess实现全站HTTPS重定向,仅排除子域单个页面
解决方案:.htaccess实现主域/子域全站HTTPS,仅指定子域页面强制HTTP
刚好处理过类似的场景,结合Cloudflare托管SSL的特性,我们可以通过调整.htaccess的规则顺序来完美实现你的需求——先让例外页面强制走HTTP,再让其他所有页面强制HTTPS,这样就不会出现规则冲突的问题了。
第一步:先对子域的特定页面强制HTTP
这个规则一定要放在最前面,这样它会优先匹配,避免被后面的HTTPS重定向规则覆盖。假设你要例外的页面是demo.mysite.com/iframe-loader.php,请替换成你实际的页面路径:
RewriteEngine On # 强制demo子域的指定页面使用HTTP RewriteCond %{HTTP_HOST} ^demo\.mysite\.com$ [NC] RewriteCond %{REQUEST_URI} ^/iframe-loader\.php$ [NC] # 检查是否是HTTPS访问(包含Cloudflare转发的场景) RewriteCond %{HTTPS} on [OR] RewriteCond %{HTTP:CF-Visitor} '"scheme":"https"' [NC] RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
规则说明:
%{HTTP_HOST}和%{REQUEST_URI}的条件用来精准匹配你要例外的子域和页面,[NC]表示不区分大小写,容错性更强- 因为Cloudflare会把HTTPS请求转发到你的服务器时用HTTP协议,所以额外加了
CF-Visitor头的检查,确保能正确识别用户实际的访问协议 [L]表示匹配到这个规则后就停止后续规则的执行,避免被后面的HTTPS重定向覆盖;R=301是永久重定向,测试阶段可以改成R=302临时重定向,确认规则没问题后再换回来
第二步:对主域和子域的其他页面强制HTTPS
在上面的例外规则之后,添加全站HTTPS的重定向规则:
# 强制主域和demo子域的其他所有页面使用HTTPS RewriteCond %{HTTPS} off [AND] RewriteCond %{HTTP:CF-Visitor} !'"scheme":"https"' [NC] RewriteCond %{HTTP_HOST} ^(www\.mysite\.com|demo\.mysite\.com)$ [NC] RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
规则说明:
- 这里用
[AND]同时检查服务器收到的请求是HTTP,且用户实际访问的不是HTTPS,避免出现重复重定向的问题 %{HTTP_HOST}的条件同时匹配主域和子域,确保这两个域名下的所有页面(除了前面指定的例外)都强制跳转HTTPS
额外注意事项
- 如果有多个需要例外的页面,可以修改
REQUEST_URI的条件,用正则匹配多个路径,比如^/(iframe-loader|embed-page)\.php$ - 确保你的服务器已经启用了
mod_rewrite模块,否则这些规则不会生效 - 修改.htaccess后,记得清除Cloudflare的缓存,或者等待缓存过期,避免旧规则仍然生效
内容的提问来源于stack exchange,提问作者Apple Bux
相关产品推荐
相关产品推荐

