页面规则 - 动作
限制请求速率
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
limit_key | string | 否 | 限速键值,用于区分不同类型的请求,详细信息请参阅limit_key 的可选值 |
key_arg | string | 否 | 配合 limit_key 使用,某些 limit_key 需要指定附加参数 |
limit_keys | array | 否 | 限速的键值对,是一个 包含 name 和 arg 参数的哈希表的数组,与 limit_key 二选一使用,limit_key 的可选值 |
rate_shape | number | 是 | 达到该请求速率时开始流量控制 |
rate_shape_unit | string | 是 | 流量控制单位,选项有:r/s(每秒请求数)和 r/min(每分钟请求数) |
rate_reject | number | 是 | 达到该请求速率时开始执行 reject_action 对超速请求进行处理 |
rate_reject_unit | string | 是 | 超速处理单位,选项有:r/s(每秒请求数)和 r/min(每分钟请求数) |
reject_action | string | 是 | 超速时执行的动作,详见reject_action 的可选值 |
error_page_status_code | string | 否 | 当 reject_action 为 error_page 时,需设置该响应状态码 |
edge_captcha_clearance_time | string | 是 | 当 reject_action 为 enable_edge_captcha 时,需设置该字段 |
hcaptcha_clearance_time | string | 是 | 当 reject_action 为 enable_hcaptcha 时,需设置该字段 |
redirect_validate_clearance_time | string | 是 | 当 reject_action 为 redirect_validate 时,需设置该字段 |
limit_key
或 limit_keys
的 name
参数的可选值:
- client-addr:客户端地址
- uri:请求的 URI
- uri-arg:请求参数
- req-cookie:请求中的 Cookie
- req-header:请求头
- first-x-forwarded-addr:请求头中 X-Forwarded-For 的第一个地址
- last-x-forwarded-addr:请求头中 X-Forwarded-For 的最后一个地址
uri-arg
、req-cookie
和 req-header
需要配合 key_arg
使用,以指定具体的参数、Cookie 或请求头名称。
reject_action
可选值:
- enable_hcaptcha:启用 hCaptcha 验证码验证
- enable_edge_captcha:启用 Edge Captcha 验证码验证
- error_page:返回指定
error_page_status_code
对应的错误页面 - close_connection:直接关闭 TCP 连接
- redirect_validate:执行重定向验证
- js_challenge:执行 JS 挑战
示例
示例 1:
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
limit-req-rate:
limit_key: uri
rate_shape: 10
rate_shape_unit: r/s
rate_reject: 20
rate_reject_unit: r/s
reject_action: error_page
error_page_status_code: 429
示例展示了基于 URI 进行请求限速。当请求速率达到 10 r/s 时,开始流量控制,即请求可能会被延迟处理;当请求速率达到 20 r/s 时,对超速的请求执行拒绝策略,返回状态码 429 的错误页面。
示例 2:
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
- limit-req-rate:
limit_keys:
- name: client-addr
- name: req-header
arg: ABC
- name: uri
rate_shape: 10
rate_shape_unit: r/s
rate_reject: 20
rate_reject_unit: r/s
error_page_status_code: 403
reject_action: page_template
page_template_name: page403
此示例与示例 1 不同在于:指定了多个限速 key,并且拒绝动作是 page_template
,响应状态码是 403
。
断路器
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
strategy | string | 是 | 断路器采用的策略,选项包括 slow-ratio、failure-ratio 和 failure-count |
window_time | string | 是 | 统计错误或慢响应比例的滑动窗口时长,单位为秒 |
open_time | number | 是 | 断路器跳闸后保持打开状态的时长,在此期间所有请求执行 open_action ,单位为秒 |
hopen_time | string | 是 | 半开状态时长,在此期间断路器尝试恢复执行有限请求测试的阶段,单位为秒 |
failure_time | number | 否 | 视为慢请求的时间阈值,单位为毫秒 |
failure_status | string | 否 | 视为失败请求的状态码列表,支持的状态码为 401、403、404、414、502、503、503 等 |
failure_percent | string | 否 | 触发断路器跳闸的失败或慢请求百分比阈值 |
failure_count | string | 否 | 触发断路器跳闸的失败请求数量阈值 |
min_reqs_in_window | string | 是 | 滑动窗口期内达到的最小请求量,用于计算并触发跳闸 |
open_action | string | 是 | 断路器打开时执行的动作,当前支持的动作有 exit (返回默认响应)和 redirect (重定向至备用服务)等 |
resp_status | string | 否 | 当 open_action 为 exit 时,断路器打开后返回的 HTTP 状态码 |
resp_body | string | 否 | 当 open_action 为 exit 时,断路器打开后返回的响应体内容 |
redirect_url | string | 否 | 当 open_action 为 redirect 时,断路器打开后重定向的 URL |
断路器策略选项:
- slow-ratio:慢请求比率,当慢请求与正常请求的比率达到阈值时,断路器跳闸。
- failure-ratio:失败请求比率,当失败请求与正常请求的比率达到阈值时,断路器跳闸。
- failure-count:失败请求数,当失败请求量达到阈值时,断路器跳闸。
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
enable-circuit-breaker:
strategy: failure-count
window_time: 10
open_time: 15
hopen_time: 30
open_action: exit
failure_time: 3000
failure_status:
- 500
- 502
- 503
failure_count: 3
min_reqs_in_window: 5
resp_status: 500
此示例中采用了“失败请求数量”策略的断路器。当 URI 为 /hello
时,启用断路器。10 秒的时间窗口内若超过 5 次请求并且 500、502 或 503 的失败请求达到 3 次,断路器将跳闸 15 秒。在跳闸期间,所有请求将执行 exit
动作并返回状态码 500。跳闸状态持续 15 秒后,转入半开状态 30 秒,此期间若首个请求成功,则恢复打开状态;否则重回跳闸状态。
阻断请求
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
limit_key | string | 是 | 限速键值,用于区分不同类型的请求,详细信息请参阅limit_key 的可选值 |
key_arg | string | 否 | 配合 limit_key 使用,某些 limit_key 需要指定附加参数 |
limit_keys | array | 否 | 限速的键值对,是一个 包含 name 和 arg 参数的哈希表的数组,与 limit_key 二选一使用,limit_key 的可选值 |
rate_shape | number | 是 | 达到该请求速率时开始流量控制 |
rate_shape_unit | string | 是 | 流量控制单位,选项有:r/s(每秒请求数)和 r/min(每分钟请求数) |
rate_reject | number | 是 | 达到该请求速率时,对请求进行 503 响应 |
rate_reject_unit | string | 是 | 超速处理单位,选项有:r/s(每秒请求数)和 r/min(每分钟请求数) |
block_threshold | number | 是 | 阻断的请求的数量阈值 |
observe_interval | number | 否 | 观察周期,单位:秒 |
block_time | number | 否 | 阻断时长,单位:秒 |
reject_action | string | 是 | 拒绝请求时执行的动作,详见reject_action 的可选值 |
clearance_time | number | 否 | Edge captcha、Hcaptcha 等的清理时间,单位:秒 |
status_code | number | 否 | 响应状态码,reject_action 为 error_page 或 page_template 时可配置 |
page_template_name | number | 否 | 页面模板的名称 |
在 observe_interval
观察周期内,如果被限速的请求量达到 block_threshold
阻断阈值,则对由 limit_key
标识的请求实施持续 block_time
秒的阻断,直接响应 503。
后续会支持更多阻断动作。
示例
示例 1:
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
block-req:
limit_key: uri
rate_shape: 10
rate_shape_unit: r/s
rate_reject: 20
rate_reject_unit: r/s
block_threshold: 10
observe_interval: 60
block_time: 3600
在该示例中,根据 URI 对请求进行分类。当请求速率达到 10 r/s 时,开始流量控制;当请求速率达到 20 r/s 时,拒绝超速的请求。如果在 60 秒的观察周期内拒绝的请求超过了 10 个阻断阈值,那么后续的此类请求将直接返回状态码 503,并持续阻断 3600 秒。
示例 2:
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
- block-req:
limit_keys:
- name: uri
rate_shape: 10
rate_shape_unit: r/s
rate_reject: 20
rate_reject_unit: r/s
block_threshold: 10
observe_interval: 60
block_time: 3600
clearance_time: 60
status_code: 404
reject_action: page_template
page_template_name: page404
在这个示例与“示例 1”唯一的不同在于,设置了拒绝动作为 page_template
,页面模板的名称为 page404
,响应状态码为 404。
OAuth JWT 验证
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
discovery | string | 否 | 通过 URL 发现配置信息,与 public_key 和 symmetric_key 三选一使用 |
public_key | string | 否 | 非对称加密的公钥,与 discovery 和 symmetric_key 三选一使用 |
symmetric_key | number | 否 | 对称加密的私钥,与 discovery 和 public_key 三选一使用 |
token_signing_alg | array | 是 | 用于验证 token 的算法类型,支持 HS256、HS512、RS256、ES256、ES512、RS512、none 等,可多选 |
accept_unsupported_alg | bool | 是 | 是否接受不支持的算法 |
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
oauth2-jwt-validate:
discovery: https://accounts.openresty.com/.well-known/introspect-configuration
token_signing_alg:
- HS256
- HS512
- RS256
- ES256
- ES512
- RS512
- none
accept_unsupported_alg: false
在此示例中,当请求 URI 为 /hello
时,启用 OAuth2 JWT 验证。秘钥通过 URL 发现,配置中选中了所有支持的 token 签名算法,并拒绝不支持的算法。
启用 Basic Authentication
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
group_name | string | 是 | Basic 认证用户组的名称 |
group_type | string | 否 | Basic 认证用户组的类型,可选 app、global |
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
enable-basic-authentication:
group_name: hello
在此示例中,当请求 URI 为 /hello
时,启用 Basic 认证,只有属于 hello
用户组的成员才能访问对应的资源。
示例 2:
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
- enable-basic-authentication:
group_name: hello
group_type: global
在此示例中,当请求 URI 为 /hello
时,启用 Basic 认证,只有属于 全局用户组 hello
的成员才能访问对应的资源。
启用 WebSocket
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
enable-websocket: {}
设置 URI
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
uri | string | 是 | 想要设置的新 URI |
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
set-uri:
uri: /world
示例中,当请求 URI 为 /hello
时,URI 将被修改为 /world
。
添加 URI 前缀
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
value | string | 是 | 想要添加的 URI 前缀 |
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /world
actions:
add-uri-prefix:
value: /hello
示例中,当请求 URI 为 /world
时,URI 将被修改为 /hello/world
。
删除 URI 前缀
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
value | string | 是 | 想要删除的 URI 前缀 |
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
rm-uri-prefix:
value: /hello
示例中,当请求 URI 为 /hello/world
时,将会删除 URI 中的 /hello
前缀,URI 最终变为 /world
。
设置请求头
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
header | string | 是 | 要设置的请求头名称 |
value | string | 是 | 要设置的请求头的值 |
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
set-req-header:
header: Host
value: openresty.com
示例中,当请求 URI 为 /hello/world
时,将会修改 Host
请求头为 openresty.com
,若不存在 Host
请求头,则会添加一个。
添加请求头
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
header | string | 是 | 要添加的请求头名称 |
value | string | 是 | 要添加的请求头的值 |
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
add-req-header:
header: Foo
value: Bar
示例中,当请求 URI 为 /hello/world
时,无论 Foo
请求头是否已存在,都会添加 Foo: Bar
请求头。
删除请求头
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
name | string | 是 | 要删除的请求头的名称 |
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
rm-req-header:
name: Foo
在此示例中,当请求的 URI 为 /hello/world
时,工具将会移除请求头中的 Foo
。若此时请求被代理至上游服务器,上游服务器将不会收到此请求头。
设置代理 URI
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
uri | string | 是 | 要设置的代理 URI |
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
set-proxy-uri:
uri: /hello/world
此示例展示,当请求的 URI 为 /hello
时,将会在代理请求中将 URI 更改为 /hello/world
,而原始请求中的 URI 保持不变。
设置代理请求头
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
header | string | 是 | 要设置的代理请求头名称 |
value | string | 否 | 设置的代理请求头值,与 el_var 二者选一 |
el_var | string | 否 | 使用 Edge 变量作为请求头值,与 value 二者选一 |
el_var_arg | string | 否 | 如有需要,与 el_var 一同使用 |
请求头的值可通过 value
直接设置为固定值,或者通过 el_var
和 el_var_arg
设置为动态值。下文将会提供两种情况的示例。
el_var
支持的变量包括:
- client-addr:客户端地址
- client-port:客户端端口
- host:请求的主机名
- scheme:HTTP 请求的协议,可为 http 或 https
- first-x-forwarded-addr:X-Forwarded-For 请求头的第一个地址
- last-x-forwarded-addr:X-Forwarded-For 请求头的最后一个地址
- system-hostname:OpenResty Edge 节点的系统主机名
- req-header:指定请求头,请求头名称通过
el_var_arg
指定 - ssl-client-s-dn:SSL 客户端证书的持有者信息
- ssl-client-i-dn:SSL 客户端证书的签发机构(CA)信息
- ssl-client-serial:SSL 客户端证书的序列号
- ssl-client-verify-result:SSL 客户端证书的验证结果
示例
示例 1:
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
set-proxy-header:
header: Host
value: openresty.com
此示例中,当请求的 URI 为 /hello/world
时,将会设置代理请求的 Host
请求头为 openresty.com
。若无 Host
请求头,则会添加。
示例 2:
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
set-proxy-header:
header: X-Forwarded-For
el_var: client-addr
在此示例中,当请求的 URI 为 /hello/world
时,将会将代理请求的 X-Forwarded-For
请求头设置为实际的客户端地址。
示例 3:
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
set-proxy-header:
header: Host
el_var: req-header
el_var_arg: Host
在此示例中,当请求的 URI 为 /hello/world
时,将会把原始请求头中的 Host
请求头设置到代理请求中。
设置响应头
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
name | string | 是 | 要设置的响应头名称 |
value | string | 否 | 设置的响应头值,与 el_var 二者选一 |
el_var | string | 否 | 使用 Edge 变量作为响应头值,与 value 二者选一 |
el_var_arg | string | 否 | 如有需要,与 el_var 一同使用 |
响应头的值可通过 value
直接设置为固定值,或者通过 el_var
和 el_var_arg
设置为动态值。如下所示,提供两种情况的示例。
el_var
支持的变量包括:
- system-hostname:OpenResty Edge 节点的系统主机名
- req-header:指定请求头,请求头名称通过
el_var_arg
指定
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
set-resp-header:
name: Foo
value: Bar
在此示例中,当请求的 URI 为 /hello/world
时,将会设置响应头 Foo: Bar
。若无 Foo
响应头,则会添加之。
添加响应头
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
name | string | 是 | 要添加的响应头名称 |
value | string | 否 | 添加的响应头值,与 el_var 二者选一 |
el_var | string | 否 | 使用 Edge 变量作为响应头值,与 value 二者选一 |
el_var_arg | string | 否 | 如有需要,与 el_var 一同使用 |
响应头的值可通过 value
直接设置为固定值,或者通过 el_var
和 el_var_arg
设置为动态值。如下所示,提供两种情况的示例。
el_var
支持的变量包括:
- system-hostname:OpenResty Edge 节点的系统主机名
- req-header:指定请求头,请求头名称通过
el_var_arg
指定
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
add-resp-header:
name: Foo
value: Bar
在此示例中,无论响应中是否已存在 Foo
响应头,当请求的 URI 为 /hello/world
时,都会添加一个 Foo: Bar
的响应头。
删除响应头
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
name | string | 是 | 要删除的响应头的名称 |
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
rm-resp-header:
name: Access-Control-Allow-Origin
在此示例中,当请求的 URI 为 /hello/world
时,如果响应头中包含 Access-Control-Allow-Origin
,则会将其删除。
输出响应体
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
msg | string | 是 | 要输出的响应体内容 |
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
print:
msg: |
Hello World!
在此示例中,当请求的 URI 为 /hello/world
时,将会输出 Hello World!
作为响应体。
退出当前请求
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
code | number | 是 | HTTP 响应状态码 |
示例
- enable_rule: true
conditions:
- var: uri
op: eq
val: /bad/request
actions:
exit:
code: 403
在此示例中,当请求的 URI 为 /bad/request
时,将会以 403
状态码响应请求。
设置变量
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
var_name | string | 是 | 变量名称 |
var_type | string | 是 | 变量类型,可选 app 和 global,分别表示应用用户变量和全局用户变量 |
value | string | 是 | 变量的值 |
示例
- enable_rule: true
order: 11
actions:
- set-var:
value: hello
var_name: uuid
var_type: app
- set-var:
value: world
var_name: uuid
var_type: global
在此示例中,设置了应用用户变量 uuid
的值为 hello
以及全局用户变量 uuid
的值为 world
。
使用 Edgelang 语言
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
el | number | 是 | Edgelagn 源码 |
示例
- enable_rule: true
order: 12
actions:
- user-code:
el: |-
true =>
say($or_user_variable_test),
say($or_global_user_variable_uuid);
在此示例中,将应用用户变量 uuid
和全局用户变量 uuid
作为请求的响应进行输出。
自定义错误页面
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
status | array | 是 | HTTP 状态码列表 |
content_type | string | 是 | 内容类型 |
file_path | string | 否 | 静态文件路径 |
page_template_name | string | 否 | 页面模板的名称 |
示例
- enable_rule: true
actions:
- set-error-page:
status:
- 404
content_type: text/html; charset=utf8
file_path: dir1/setup.sh
- set-error-page:
status:
- 403
content_type: text/html; charset=utf8
page_template_name: page403
在此用例中包含两个动作,一个是设置 404 状态码的错误页为一个路径为 dir1/setup.sh
静态文件。另一个是设置 403 状态码的错误也为名为 page403
的页面模板。
自定义动作
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
global_action_name | string | 是 | 全局自定义动作的名称 |
示例
- enable_rule: true
actions:
- global_action:
global_action_name: global-action-1
- global_action:
global_action_name: global-action-2
在此用例中包含两个动作,一个是名为 global-action-1
的全局自定义动作,另一个是名为 global-action-2
的全局自定义动作。
镜像请求
参数说明
参数名 | 数据类型 | 是否必选 | 描述 |
---|---|---|---|
upstream_type | string | 是 | 上游类型,可选 app 和 global,分别表示应用上游和全局上游 |
upstream_name | string | 是 | 上游名称 |
retries | number | 否 | 重试次数 |
retry_condition | array | 否 | 重试条件,可选的重试条件有:error、timeout、invalid_header、http_500、http_502、http_504、http_503、http_404 |
type | string | 否 | 静态请求的类型,raw:镜像原始请求,custom:自定义 Lua 模块处理后的请求 |
module_name | string | 否 | 当 type 选择 custom 是,需要指定 Lua 模块的名称 |
algorithm | string | 否 | 负载均衡的算法,支持 chash、hash、roundrobin |
send_timeout | number | 否 | 发送超时 |
conn_timeout | number | 否 | 连接超时 |
read_timeout | number | 否 | 读取超时 |
示例
- enable_rule: true
actions:
- mirror-request:
retries: 1
upstream_type: global
conn_timeout: 60
type: raw
retry_condition:
- error
- timeout
- invalid_header
- http_500
- http_502
- http_504
module_name: ''
algorithm: hash
send_timeout: 60
read_timeout: 60
upstream_name: global_upstream_name1
在这个示例中,将原始请求镜像到名为 global_upstream_name1
的全局上游。