Condition

最近更新时间:2025-11-18 11:30:42

我的收藏
本文档介绍了各功能模块中条件表达式支持的语法内容和书写规范。不同功能模块的条件表达式均采用统一的结构格式,具体支持的目标字段、运算符和值类型可能因模块而异。

表达式结构

条件表达式由三个基本组成部分构成:​​目标字段​​、​​运算符​​和​​值​​,其基本格式如下图所示:



目标字段​​:通常为 ${…} 形式的内置 变量,例如 ${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]
引号与转义:列表中的字符串用单引号,内部如果包含特殊字符(例如 @. 等)无需额外转义。
大小写:操作符统一使用小写(如 andornotinlikecontain),字段名称区分大小写(例如 User-Agentuser-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 ['']