运算符和分组符号

更新时间:
复制 MD 格式

规则中的匹配运算符主要包含了比较运算符和逻辑运算符两种类型。通过十余种比较运算符、规则间的逻辑运算符,帮助您构建出丰富的规则表达式。

比较运算符

比较运算符用于将请求传入值和表达式中配置的值进行比较。

contains

表示请求传入值中包含特定字符串。

  • 运算符名称:包含

  • 匹配的值类型:String

  • 使用示例:

    (http.host contains "example.com")

ends_with

表示请求传入值的结尾符合设定的匹配值。

  • 运算符名称:结尾为

  • 匹配的值类型:String

  • 使用示例:

    (ends_with(http.host, "cn"))

eq

表示请求传入值与匹配值相等。

  • 运算符名称:等于

  • 匹配的值类型:String

  • 使用示例:

    (http.host eq "www.example.com")

exists

判断请求是否存在设定值。

  • 运算符名称:存在

  • 匹配的值类型:String

  • 使用示例:

    (exists(http.request.headers["user-agent"]))

ge

表示请求传入值大于或等于设定的匹配值。

  • 运算符名称:大于或等于

  • 匹配的值类型:int

  • 使用示例:

    (ip.geoip.asnum ge 45104)

gt

表示请求传入值大于设定的匹配值。

  • 运算符名称:大于

  • 匹配的值类型:int

  • 使用示例:

    (ip.geoip.asnum gt 45104)

in

表示请求传入值中有一个或多个设定匹配值。您可以结合使用 $ 实现分组。

  • 运算符名称:等于其中任意一个

  • 匹配的值类型:Array

  • 使用示例:

    (http.host in {"www.example.com" "blog.example.com"})

    ( ip.src in $<LIST_NAME>)

le

表示请求传入值小于或等于设定的匹配值。

  • 运算符名称:小于或等于

  • 匹配的值类型:int

  • 使用示例:

    (ip.geoip.asnum le 45104)

len eq

表示请求传入值的长度等于设定的匹配值。

  • 运算符名称:长度等于

  • 匹配的值类型:String

  • 使用示例:

    (len(http.request.cookies["session"]) eq 330688)

len gt

表示请求传入值的长度大于设定的匹配值。

  • 运算符名称:长度大于

  • 匹配的值类型:String

  • 使用示例:

    (len(http.request.cookies["session"]) gt 330688)

len lt

表示请求传入值的长度小于设定的匹配值。

  • 运算符名称:长度小于

  • 匹配的值类型:String

  • 使用示例:

    (len(http.request.cookies["session"]) lt 330688)

lt

表示请求传入值小于设定的匹配值。

  • 运算符名称:小于

  • 匹配的值类型:int

  • 使用示例:

    (ip.geoip.asnum lt 45104)

matches

表示请求传入值符合特定的正则表达式,兼容 PCRE 正则表达式标准。

说明

高级版企业版套餐支持正则表达式。

  • 运算符名称:与正则表达式匹配

  • 匹配的值类型:String

  • 使用示例:

    (http.host matches "(www|blog)\.example\.com")

ne

表示请求传入值与匹配值不相等。

  • 运算符名称:不等于

  • 匹配的值类型:String

  • 使用示例:

    (http.host ne "www.example.com")

not ends_with

表示请求传入值的结尾不符合设定的匹配值。

  • 运算符名称:结尾不是

  • 匹配的值类型:String

  • 使用示例:

    (not ends_with(http.host, "cn"))

not exists

判断请求是否不存在设定值。

  • 运算符名称:不存在

  • 匹配的值类型:String

  • 使用示例:

    (not exists(http.request.headers["user-agent"]))

not starts_with

表示请求传入值的开头不符合设定的匹配值。

  • 运算符名称:开头不为

  • 匹配的值类型:String

  • 使用示例:

    (not starts_with(http.host, "blog"))

not...contains

表示请求传入值中不包含特定字符串。

  • 运算符名称:不包含

  • 匹配的值类型:String

  • 使用示例:

    (not http.host contains "example.com")

not...in

表示请求传入值中不包含所有的设定匹配值。您可以结合使用 $ 实现分组。

  • 运算符名称:不等于其中任意一个

  • 匹配的值类型:Array

  • 使用示例:

    (not http.host in {"www.example.com" "blog.example.com"})

    (not ip.src in $<LIST_NAME>)

not...matches

表示请求传入值不符合特定的正则表达式,兼容 PCRE 正则表达式标准。

说明

高级版企业版套餐支持正则表达式。

  • 运算符名称:与正则表达式不匹配

  • 匹配的值类型:String

  • 使用示例:

    (not http.host matches "(www|blog)\.example\.com")

percent

表示按指定的字段和比例对请求进行过滤。

  • 运算符名称:比例

  • 匹配的值类型:Int

  • 匹配值范围:1~100

  • 注意事项:当字段值为空时(例如请求未携带指定的 header),该条规则不生效,匹配结果为 false。

支持使用该运算符的匹配字段:

  • 标头:http.request.headers["example"]

  • 客户端 IP:ip.src

  • URI 指定查询字符串:http.request.uri.args["example"]

  • 请求时间戳:http.request.timestamp.sec

使用示例:

  • percent(http.request.headers["example"],80)

  • percent(ip.src,80)

  • percent(http.request.cookies["example"],80)

  • percent(http.request.args["example"],80)

  • percent(http.request.timestamp.sec,80)

starts_with

表示请求传入值的开头符合设定的匹配值。

  • 运算符名称:开头为

  • 匹配的值类型:String

  • 使用示例:

    (starts_with(http.host, "blog"))

其他运算符

lower

用于不区分请求值大小写时,将请求传入值统一转换为小写。

  • 运算符名称:不区分大小写

  • 匹配的值类型:String

  • 使用示例:

    (lower(http.request.uri))

逻辑运算符

逻辑运算符用于将多个表达式组合成一个复合表达式

and

表示请求需要同时满足两个或多个表达式。

  • 运算符名称:逻辑且

  • 使用示例:

    (http.host eq "www.example.com" and ip.geoip.country eq "CN")

not

表示对某个表达式的逻辑取反。

  • 运算符名称:逻辑非

  • 使用示例:

    not (http.host )

or

表示请求只需满足多个表达式中的一个即可。

  • 运算符名称:逻辑或

  • 使用示例:

    (http.host eq "www.example.com") or (ip.geoip.country eq "CN")

分组符号

规则引擎支持使用括号 () 作为分组符号。分组符号是表达式的组成部分,支持通过嵌套表达式设置执行优先级。

仅表达式编辑器和 ESA 的 API 支持分组符号,表达式构建器不支持。

分组嵌套表达式配置示例:

(http.host eq "www.example.com" and ((http.referer in {"download.example.com"}) or (http.referer in {"image.example.com"})))