mod_setenvif 通过匹配请求头动态设置环境变量,用于日志控制、条件改写等;需启用模块,变量名仅限字母数字下划线,支持正则但需转义,作用域内生效且后写覆盖前写。
apache 中用 mod_setenvif 根据请求头动态设环境变量,核心是匹配客户端发送的 http 请求头(如 user-agent、host、referer 等),符合条件就设置一个环境变量,后续可用于日志控制、条件改写、限流或路由等场景。它不修改请求本身,只“打标签”,轻量且高效。
确认模块已启用并检查语法支持
先确保模块已加载:
- 运行
httpd -M | grep setenvif或a2enmod setenvif && systemctl reload apache2(Debian/Ubuntu) - 若手动编译,确认
LoadModule setenvif_module modules/mod_setenvif.so在主配置中未被注释 -
SetEnvIf指令支持正则表达式,但点号.、星号*等需转义;空格建议用引号包裹,例如:SetEnvIf Host "api\.example\.com$" API_ENV=prod
按常见请求头设置变量的写法
环境变量名只能含字母、数字、下划线,不能含短横线(如 X-User-ID 不合法,得写成 USER_ID):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 根据域名区分环境:
SetEnvIf Host "^dev\.example\.com$" ENV=dev - 识别移动端用户:
SetEnvIfNoCase User-Agent "(iPhone|Android)" IS_MOBILE=1 - 标记调试请求:
SetEnvIfNoCase X-Debug "^true$" DEBUG_REQ=1 - 按 Referer 防盗链:
SetEnvIfNoCase Referer "^https?://(www\.)?myapp\.com" ALLOWED_REF=1
配合其他模块实现条件动作
设好变量后,它本身不生效,必须被其他模块引用:
- 控制访问:
<FilesMatch "\.(jpg|png)$"> Require env ALLOWED_REF </FilesMatch> - 定制日志:
CustomLog logs/access.log combined env=!DEBUG_REQ(排除调试请求) - 触发请求头改写:
RequestHeader set X-Env "%{ENV}e" env=ENV(仅当 ENV 变量存在时才注入) - 联动限流:
<IfModule mod_evasive20.c> <IfModule mod_setenvif.c> SetEnvIf DEBUG_REQ 1 DOS_ENABLED </IfModule> </IfModule>
注意作用域和执行顺序
环境变量在定义它的作用域内有效,且按配置文件中出现顺序依次执行:
- 写在
<VirtualHost>里,对整个虚拟主机生效;写在<Directory>或.htaccess中,则只影响对应路径 - 多个
SetEnvIf规则同名变量会被后写的覆盖,没有“累加”逻辑 - 若同时用了
mod_rewrite,SetEnvIf匹配的是原始请求头,不是重写后的值;如需基于重写结果判断,得用<If>表达式替代

















