Apache 可通过 RewriteCond 检查 %{HTTPS} 变量实现协议区分处理:HTTPS 为 on 时为安全连接,否则为 HTTP;常用场景包括强制 HTTPS 跳转、HTTP 下资源降级、API 接口仅限 HTTPS 访问,并需确保 mod_rewrite 启用且 .htaccess 权限允许。

要让 Apache 根据访问协议(HTTP 或 HTTPS)执行不同重写逻辑,关键在于用 RewriteCond 检查 %{HTTPS} 变量或 %{SERVER_PORT},再配合 RewriteRule 实现跳转或内部重写。
判断是否为 HTTPS 请求
最常用、最可靠的方式是检查 %{HTTPS} 服务器变量:
-
%{HTTPS} = on表示当前请求走的是 HTTPS 协议 -
%{HTTPS} != on或%{HTTPS} = off表示是 HTTP 请求(注意:部分旧版 Apache 可能返回空字符串而非off,建议用!= on更稳妥)
强制跳转到 HTTPS
这是最常见的安全需求,适用于全站或特定路径:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteEngine On
RewriteCond %{HTTPS} != on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
-
RewriteCond %{HTTPS} != on:仅当非 HTTPS 时触发 -
https://%{HTTP_HOST}%{REQUEST_URI}:保持原域名和完整路径,避免丢失参数 -
[R=301,L]:301 永久重定向,L表示终止后续规则匹配
仅对 HTTP 请求做特殊处理(如加载资源降级)
比如在 HTTP 下禁用某些现代特性,或加载兼容性脚本:
RewriteEngine On
RewriteCond %{HTTPS} != on
RewriteCond %{REQUEST_URI} ^/assets/js/main\.js$
RewriteRule ^(.*)$ /assets/js/main-http.js [L]
- 第一行条件限定协议为 HTTP
- 第二行进一步限定只针对特定 JS 文件路径
- 匹配后内部重写为另一个文件,浏览器地址栏不变
区分协议处理 API 路由
某些接口需在 HTTPS 下才允许访问,HTTP 则统一返回提示页:
RewriteEngine On
RewriteCond %{HTTPS} != on
RewriteCond %{REQUEST_URI} ^/api/
RewriteRule ^(.*)$ /error/https-required.html [R=403,L]
- 两个
RewriteCond同时满足(AND 关系)才执行重写 -
[R=403]返回禁止访问状态,比跳转更符合语义
不复杂但容易忽略:确保 mod_rewrite 已启用且 .htaccess 权限允许(AllowOverride All),否则规则不会生效。

















