本文档介绍了各功能模块中条件表达式支持的语法内容和书写规范。不同功能模块的条件表达式均采用统一的结构格式,具体支持的目标字段、运算符和值类型可能因模块而异。
表达式结构
条件表达式由三个基本组成部分构成:目标字段、运算符和值,其基本格式如下图所示:


目标字段:通常为 ${…} 形式的内置 变量,例如
${http.request.uri.path}、${http.request.method} 等,用于提取请求中的特定信息。运算符:例如 in、matches、exists 等,用于判断目标字段与值之间的关系。
值:可以是字符串、数字、列表或其他变量,需根据运算符使用方括号
[ ] 包裹,例如 ['POST'] 或 [100, 200]。运算符
匹配运算符
名称 | 关键字 | 支持的数据类型 | 示例 | 支持的功能模块 |
值在集合内 | in | String、Number 说明: Number 支持整形、浮点。 集合支持常值和变量。 | ${http.request.file_extension} in ["jpg", "png"] | 站点加速、边缘函数、Web 防护 |
正则匹配 | matches | 仅支持 String 说明: 仅支持通过常值字符串定义的正则表达式。 | ${http.request.uri.path} matches "^/admin/" | 站点加速、边缘函数、Web 防护 |
存在 | exists | 不限定数据类型 说明: 该运算符检查字段(键 / 属性)是否存在,不检查字段值。 | ${http.request.uri.args["status"]} exists | 站点加速、边缘函数、Web 防护 |
通配符匹配 | like | 仅支持 String | ${http.request.uri.path} like "/prod*" | Web 防护 |
包含匹配 | contain | 仅支持 String | ${http.request.uri.path} contain ["api", "login"] | Web 防护 |
大于 | > | 仅支持 Number | length(${http.request.headers["user-agent"]}) > 30 | Web 防护 |
小于 | < | 仅支持 Number | length(${http.request.headers["user-agent"]}) < 10 | Web 防护 |
逻辑运算符
当前的功能模块均支持该运算符规则,多个条件可通过逻辑运算符组合:
and:逻辑与,所有子条件均为真时返回真(例如
A and B)。 or:逻辑或,任一子条件为真时返回真(例如
A or B)。 not:逻辑非,对一个布尔表达式取反(例如
not A)。运算符优先级为:not > and > or,可使用括号( ) 改变运算顺序。例如:
//表示“同时满足 A 条件,且(满足 B 条件或不满足 C 条件)”。${A} and (${B} or not ${C})
表达式书写注意事项
变量格式:目标字段变量必须用
${} 括起,内部支持点式和索引式访问,例如 ${http.request.headers['User-Agent']}、${security.ip_group['123'@'zone-xyz']} 等。 值类型:字符串值必须用单引号括起并放在列表中,例如
in ['value1','value2'];数字值可直接写如 > 100;空值使用特殊关键字 null(参考特殊变量)。 列表形式:即使只有一个值,也需写成列表形式(方括号包裹),例如
in ['POST'] 或 in [200]。 引号与转义:列表中的字符串用单引号,内部如果包含特殊字符(例如
@、. 等)无需额外转义。 大小写:操作符统一使用小写(如
and、or、not、in、like、contain),字段名称区分大小写(例如 User-Agent 与 user-agent 不同)。注意:
条件匹配默认区分大小写。如需忽略大小写,请使用转换函数:
lower(${http.request.uri.args['Test']}) in ['a', 'b']。更多示例
以下是一些典型条件表达式的用法说明和对应代码:
1. 匹配特定路径和请求方法
当请求路径为
/api/v3/test 或 /api/v3/submit,且 HTTP 请求方法为 POST 时触发。${http.request.uri.path} in ['/api/v3/test','/api/v3/submit'] and ${http.request.method} in ['POST']
2. 匹配客户端 IP 或 ASN
匹配客户端 IP 地址为
1.1.1.1、属于子网 10.10.10.0/24,或其自治系统号(ASN)为 132203 的请求。${http.request.ip} in ['1.1.1.1','10.10.10.0/24'] or ${http.request.ip.asn} in ['132203']
3. 匹配特定请求头值
匹配 Referer 请求头值为
one.example.com 的请求。${http.request.headers['referer']} in ['one.example.com']
4. 检查长度
请求正文长度小于 30。
length(${http.request.body}) < 30
5. 通配符路径匹配
匹配以
/a/wildcard/path/ 或 /another/wildcard/path/ 开头的请求路径。${http.request.uri.path} like ['/a/wildcard/path/*','/another/wildcard/path/*']
6. 字符串包含检查
匹配请求路径中包含子串 api 或 test 的请求。
${http.request.uri.path} contain ['api','test']
7. 复合存在性与取值检查
匹配 Accepts 请求头不存在,且 CustomHeader 请求头值为空字符串的请求。
not ${http.request.headers['Accepts']} exists and ${http.request.headers['CustomHeader']} in ['']