页面规则 - 条件

页面规则条件配置中允许定义多个条件,它们之间是逻辑上的关系。这意味着仅当所有条件均满足时,页面规则才会被触发,并执行规则所定义的动作。这些动作可以是页面规则动作、Web 应用防火墙(WAF)、代理、缓存等。

请注意,在页面规则配置中,虽然条件不是必需的,但至少需要定义一个动作

参数说明

参数名数据类型是否必选说明
varstring 或 array变量名称,示例包括 uri 或 [‘req-header’, ‘Referer’] 等
opstring操作符
valsstring条件的对比值,可以有多个,它们之间为“或”关系

常见的字符串类型“变量名称(var)”包括:

  • uri:请求的 URI,例如 /hello.html。
  • sorted-query-string:经过排序的查询参数。
  • query-string:查询参数。
  • host:主机名。
  • user-agent:用户代理。
  • scheme:协议类型,可能是 http 或 https。
  • client-country:客户端所在国家或地区代码,如美国是 US、英国是 UK、中国是 CN。
  • client-addr:客户端 IP 地址。
  • server-addr:服务器 IP 地址。
  • server-port:服务器端口号。
  • req-method:HTTP 请求方法,如 CONNECT、DELETE、GET、HEAD、POST、PUT、TRACE、OPTIONS、PATCH 等。
  • first-x-forwarded-addr:X-Forwarded-For 请求头中的第一个 IP 地址,如 1.1.1.1,2.2.2.2 中的 1.1.1.1
  • last-x-forwarded-addr:X-Forwarded-For 请求头中的最后一个 IP 地址,如 1.1.1.1,2.2.2.2 中的 2.2.2.2
  • http-version:HTTP 版本号,可能是 2.0、1.1、1.0、0.9。

常见的数组类型“变量名称(var)”包括:

  • uri-arg:URI 中的参数,例如 hello.html?username=openresty 中的 username
  • req-header:请求头信息,例如 Host: openresty.com 中的 Host
  • req-cookie:请求中的 Cookie,例如 Cookie: token=tokenvalue 中的 token

常用的“操作符(op)”包括:

  • 字符串比较操作符:eq(等于),ne(不等于),lt(小于),le(小于或等于),gt(大于),ge(大于或等于)。
  • 字符串长度比较操作符:str-len-eq(长度等于),str-len-ne(长度不等于),str-len-lt(长度小于),str-len-le(长度小于或等于),str-len-gt(长度大于),str-len-ge(长度大于或等于)。
  • 正则匹配操作符:prefix(前缀匹配),!prefix(前缀不匹配),suffix(后缀匹配),!suffix(后缀不匹配),contains(包含),!contains(不包含)。
  • IP 地址比较操作符:~~(IP 匹配),!~~(IP 不匹配)。

示例

通用示例

- enable_rule: true
  conditions:
  - var: uri
    op: eq
    vals:
      - /robots.txt

  actions:
    print:
      content_type: text/html
      msg: 'Hello World'

此示例中,如果请求的 URI 等于 /robots.txt,则会执行动作,打印出 Hello World

- enable_rule: true
  conditions:
  - var:
    - req-header
    - Host
    op: suffix
    vals:
      - openresty.com

  actions:
    print:
      content_type: text/html
      msg: 'Hello World'

在此示例中,如果请求头中的 Host 后缀与 openresty.com 相匹配,则会执行动作,打印出 Hello World

使用 IP 列表

- enable_rule: true
  order: 5
  conditions:
  - var: client-addr
    op: ~~
    vals:
    - val: global-ip-list1
      type: ip-list
    - val: app-ip-list1
      type: app-ip-list
  actions:
  - set-uri:
      uri: /hello

在此示例中,如果请求的客户端地址在名为 global-ip-lists1 的全局 IP 列表或名为 app-ip-list1 的应用 IP 列表中时,将请求的 URI 设置成 /hello

使用用户变量

- enable_rule: true
  order: 6
  conditions:
  - user_var: hello
    op: prefix
    val: hello
  - global_var: world
    op: prefix
    val: world
  actions:
  - set-uri:
      uri: /anything

在此示例中,如果应用用户变量 hello 的值前缀匹配 hello,并且全局用户变量 world 的值前缀匹配 world,将会把请求的 URI 设置成 /anything

相关文档