apache rewritecond可通过%{env:key}读取环境变量,需先用setenv、setenvif或rewriterule[e=key:value]设置;变量名区分大小写,匹配时可用!^$、^value$或[or]组合,常用于按环境切换后端路径或重写静态资源。

Apache 的 RewriteCond 可以通过 %{ENV:变量名} 语法读取环境变量,再配合 RewriteRule 实现基于环境变量的重写。关键在于:环境变量需提前设置(如用 SetEnv、SetEnvIf 或 RewriteRule ... [E=...]),然后在 RewriteCond 中引用。
环境变量怎么设置
有三种常用方式,选一种即可:
-
全局设置:在虚拟主机或主配置中用
SetEnv KEY VALUE,例如:SetEnv SITE_ENV production -
条件设置:用
SetEnvIf根据请求头、IP 等动态设,例如:SetEnvIf Host "^staging\.example\.com$" SITE_ENV=staging -
重写时设置:在
RewriteRule中用[E=KEY:VALUE]标志,例如:RewriteRule ^/api/(.*)$ /backend/$1 [E=API_ROUTE:1]
RewriteCond 引用环境变量的写法
语法固定为 %{ENV:KEY},注意大小写敏感,KEY 是变量名(不含 REDIRECT_ 前缀):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 匹配非空值:
RewriteCond %{ENV:SITE_ENV} !^$ - 匹配特定值:
RewriteCond %{ENV:SITE_ENV} ^production$ - 匹配多个可能值(用 OR):
RewriteCond %{ENV:SITE_ENV} ^staging$ [OR]<br>RewriteCond %{ENV:SITE_ENV} ^dev$
常见组合示例
典型场景是根据环境切换后端路径或启用调试规则:
- 开发环境加
/debug前缀:RewriteCond %{ENV:SITE_ENV} ^dev$<br>RewriteRule ^/(.*)$ /debug/$1 [L] - 仅对 staging 环境重写静态资源到 CDN:
RewriteCond %{ENV:SITE_ENV} ^staging$<br>RewriteCond %{REQUEST_URI} \.(js|css|png|jpg)$<br>RewriteRule ^(.*)$ https://cdn-staging.example.com$1 [R=302,L]
注意环境变量的可见范围
普通 SetEnv 设置的变量在 RewriteCond 中可直接读取;但被 RewriteRule 的 [E=...] 设置的变量,在同一次请求中后续规则才能访问(因为 Apache 会先执行所有重写规则再统一处理环境变量)。若需立即使用,建议用 SetEnvIf 或提前设置。









