Apache 2.4 的 Require expr 支持基于请求上下文、证书、时间、HTTP 头等动态条件的细粒度访问控制,需置于 RequireAll/Any/None 容器内,配合变量引用、正则匹配、逻辑运算及环境变量协同使用。

Apache 2.4 的 Require expr 是访问控制的核心能力,它把授权逻辑从静态规则升级为可编程判断,支持基于请求上下文、客户端证书、时间、HTTP 头、环境变量等动态条件做细粒度放行或拦截。
基础语法与执行前提
Require expr 后接一个 Apache 表达式(Expression),必须写在 <RequireAll>、<RequireAny> 或 <RequireNone> 容器内,否则可能被忽略或报错。表达式中可用变量以 %{VAR_NAME} 形式引用,例如:
-
%{REMOTE_ADDR}:客户端真实 IP(注意代理场景需配合%{HTTP_X_FORWARDED_FOR}或mod_remoteip) -
%{SSL_CLIENT_S_DN_CN}:客户端证书中的 CN 字段(启用 mod_ssl 且配置了 SSLVerifyClient require) -
%{TIME_HOUR}、%{TIME_MIN}、%{TIME_WDAY}:服务端当前时间(24 小时制,星期日=0) -
%{HTTP_USER_AGENT}、%{HTTP_REFERER}:对应请求头值 -
%{ENV:MY_VAR}:通过SetEnv或SetEnvIf设置的环境变量
常用匹配模式写法
表达式支持正则匹配(=~)、字符串比较(==、!=)、逻辑运算(&&、||、!)和函数调用(如 ipmatch()、req())。几个典型用法:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- IP 段白名单:
Require expr ipmatch('192.168.1.0/24', %{REMOTE_ADDR}) || ipmatch('2001:db8::/32', %{REMOTE_ADDR}) - 用户代理黑名单:
Require expr %{HTTP_USER_AGENT} !~ m/(BadBot|ZmEu|oBot)/i(i表示忽略大小写) - 工作日上班时间(周一至周五 8:00–17:29):
Require expr time_wday >= 1 && time_wday <= 5 && (time_hour > 8 || (time_hour == 8 && time_min >= 0)) && (time_hour < 17 || (time_hour == 17 && time_min < 30)) - 证书 OU + CN 联合校验:
Require expr %{SSL_CLIENT_S_DN_OU} == 'Security' && %{SSL_CLIENT_S_DN_CN} =~ m/^sec-[a-z]+-[0-9]+$/
与环境变量协同增强控制力
单独用 expr 有时不够灵活,常配合 SetEnvIf 预处理字段。比如识别高危爬虫并设标记:
SetEnvIfNoCase User-Agent "(FeedDemon|JikeSpider|CrawlDaddy)" BAD_CRAWLER SetEnvIfNoCase Referer "^https?://.*\.qq\.com" QQ_REF <RequireAll> Require all granted Require not env BAD_CRAWLER Require not env QQ_REF </RequireAll>
这样就把复杂匹配逻辑下沉到环境变量层,Require expr 可专注组合判断,提升可读性和复用性。
注意事项与避坑点
实际配置中容易出错的地方包括:
- 忘记包裹
<RequireAll>—— 单独Require expr若前面有Require all granted,后者会覆盖前者 - 时间变量是服务器本地时间,非 UTC,跨时区部署需确认系统时区设置
- 证书字段仅在启用双向 TLS(
SSLVerifyClient require)后才可用,否则变量为空字符串,导致表达式恒为 false - 正则中特殊字符(如点、括号)要转义;路径分隔符斜杠无需转义,但建议统一用单引号包裹正则字面量
- 调试时可临时开启
LogLevel authz_core:trace4查看表达式求值过程

















