页面规则 - 条件
页面规则条件配置中允许定义多个条件,它们之间是逻辑上的与
关系。这意味着仅当所有条件均满足时,页面规则才会被触发,并执行规则所定义的动作。这些动作可以是页面规则动作、Web 应用防火墙(WAF)、代理、缓存等。
请注意,在页面规则配置中,虽然条件不是必需的,但至少需要定义一个动作。
参数说明
参数名 | 数据类型 | 是否必选 | 说明 |
---|---|---|---|
var | string 或 array | 是 | 变量名称,示例包括 uri 或 [‘req-header’, ‘Referer’] 等 |
op | string | 否 | 操作符 |
vals | string | 否 | 条件的对比值,可以有多个,它们之间为“或”关系 |
常见的字符串类型“变量名称(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
。