页面规则 - 动作

限制请求速率

参数说明

参数名数据类型是否必选描述
limit_keystring限速键值,用于区分不同类型的请求,详细信息请参阅limit_key 的可选值
key_argstring配合 limit_key 使用,某些 limit_key 需要指定附加参数
limit_keysarray限速的键值对,是一个 包含 name 和 arg 参数的哈希表的数组,与 limit_key 二选一使用,limit_key 的可选值
rate_shapenumber达到该请求速率时开始流量控制
rate_shape_unitstring流量控制单位,选项有:r/s(每秒请求数)和 r/min(每分钟请求数)
rate_rejectnumber达到该请求速率时开始执行 reject_action 对超速请求进行处理
rate_reject_unitstring超速处理单位,选项有:r/s(每秒请求数)和 r/min(每分钟请求数)
reject_actionstring超速时执行的动作,详见reject_action 的可选值
error_page_status_codestringreject_actionerror_page 时,需设置该响应状态码
edge_captcha_clearance_timestringreject_actionenable_edge_captcha 时,需设置该字段
hcaptcha_clearance_timestringreject_actionenable_hcaptcha 时,需设置该字段
redirect_validate_clearance_timestringreject_actionredirect_validate 时,需设置该字段

limit_keylimit_keysname 参数的可选值:

  • 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-argreq-cookiereq-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

断路器

参数说明

参数名数据类型是否必选描述
strategystring断路器采用的策略,选项包括 slow-ratio、failure-ratio 和 failure-count
window_timestring统计错误或慢响应比例的滑动窗口时长,单位为秒
open_timenumber断路器跳闸后保持打开状态的时长,在此期间所有请求执行 open_action,单位为秒
hopen_timestring半开状态时长,在此期间断路器尝试恢复执行有限请求测试的阶段,单位为秒
failure_timenumber视为慢请求的时间阈值,单位为毫秒
failure_statusstring视为失败请求的状态码列表,支持的状态码为 401、403、404、414、502、503、503 等
failure_percentstring触发断路器跳闸的失败或慢请求百分比阈值
failure_countstring触发断路器跳闸的失败请求数量阈值
min_reqs_in_windowstring滑动窗口期内达到的最小请求量,用于计算并触发跳闸
open_actionstring断路器打开时执行的动作,当前支持的动作有 exit(返回默认响应)和 redirect(重定向至备用服务)等
resp_statusstringopen_actionexit 时,断路器打开后返回的 HTTP 状态码
resp_bodystringopen_actionexit 时,断路器打开后返回的响应体内容
redirect_urlstringopen_actionredirect 时,断路器打开后重定向的 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_keystring限速键值,用于区分不同类型的请求,详细信息请参阅limit_key 的可选值
key_argstring配合 limit_key 使用,某些 limit_key 需要指定附加参数
limit_keysarray限速的键值对,是一个 包含 name 和 arg 参数的哈希表的数组,与 limit_key 二选一使用,limit_key 的可选值
rate_shapenumber达到该请求速率时开始流量控制
rate_shape_unitstring流量控制单位,选项有:r/s(每秒请求数)和 r/min(每分钟请求数)
rate_rejectnumber达到该请求速率时,对请求进行 503 响应
rate_reject_unitstring超速处理单位,选项有:r/s(每秒请求数)和 r/min(每分钟请求数)
block_thresholdnumber阻断的请求的数量阈值
observe_intervalnumber观察周期,单位:秒
block_timenumber阻断时长,单位:秒
reject_actionstring拒绝请求时执行的动作,详见reject_action 的可选值
clearance_timenumberEdge captcha、Hcaptcha 等的清理时间,单位:秒
status_codenumber响应状态码,reject_action 为 error_page 或 page_template 时可配置
page_template_namenumber页面模板的名称

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 验证

参数说明

参数名数据类型是否必选描述
discoverystring通过 URL 发现配置信息,与 public_key 和 symmetric_key 三选一使用
public_keystring非对称加密的公钥,与 discovery 和 symmetric_key 三选一使用
symmetric_keynumber对称加密的私钥,与 discovery 和 public_key 三选一使用
token_signing_algarray用于验证 token 的算法类型,支持 HS256、HS512、RS256、ES256、ES512、RS512、none 等,可多选
accept_unsupported_algbool是否接受不支持的算法

示例

- 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_namestringBasic 认证用户组的名称
group_typestringBasic 认证用户组的类型,可选 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

参数说明

参数名数据类型是否必选描述
uristring想要设置的新 URI

示例

- enable_rule: true
  conditions:
  - var: uri
    op: eq
    val: /hello

  actions:
    set-uri:
      uri: /world

示例中,当请求 URI 为 /hello 时,URI 将被修改为 /world

添加 URI 前缀

参数说明

参数名数据类型是否必选描述
valuestring想要添加的 URI 前缀

示例

- enable_rule: true
  conditions:
  - var: uri
    op: eq
    val: /world

  actions:
    add-uri-prefix:
      value: /hello

示例中,当请求 URI 为 /world 时,URI 将被修改为 /hello/world

删除 URI 前缀

参数说明

参数名数据类型是否必选描述
valuestring想要删除的 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

设置请求头

参数说明

参数名数据类型是否必选描述
headerstring要设置的请求头名称
valuestring要设置的请求头的值

示例

- 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 请求头,则会添加一个。

添加请求头

参数说明

参数名数据类型是否必选描述
headerstring要添加的请求头名称
valuestring要添加的请求头的值

示例

- 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 请求头。

删除请求头

参数说明

参数名数据类型是否必选描述
namestring要删除的请求头的名称

示例

- enable_rule: true
  conditions:
  - var: uri
    op: eq
    val: /hello/world

  actions:
    rm-req-header:
      name: Foo

在此示例中,当请求的 URI 为 /hello/world 时,工具将会移除请求头中的 Foo。若此时请求被代理至上游服务器,上游服务器将不会收到此请求头。

设置代理 URI

参数说明

参数名数据类型是否必选描述
uristring要设置的代理 URI

示例

- enable_rule: true
  conditions:
  - var: uri
    op: eq
    val: /hello

  actions:
    set-proxy-uri:
      uri: /hello/world

此示例展示,当请求的 URI 为 /hello 时,将会在代理请求中将 URI 更改为 /hello/world,而原始请求中的 URI 保持不变。

设置代理请求头

参数说明

参数名数据类型是否必选描述
headerstring要设置的代理请求头名称
valuestring设置的代理请求头值,与 el_var 二者选一
el_varstring使用 Edge 变量作为请求头值,与 value 二者选一
el_var_argstring如有需要,与 el_var 一同使用

请求头的值可通过 value 直接设置为固定值,或者通过 el_varel_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 请求头设置到代理请求中。

设置响应头

参数说明

参数名数据类型是否必选描述
namestring要设置的响应头名称
valuestring设置的响应头值,与 el_var 二者选一
el_varstring使用 Edge 变量作为响应头值,与 value 二者选一
el_var_argstring如有需要,与 el_var 一同使用

响应头的值可通过 value 直接设置为固定值,或者通过 el_varel_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 响应头,则会添加之。

添加响应头

参数说明

参数名数据类型是否必选描述
namestring要添加的响应头名称
valuestring添加的响应头值,与 el_var 二者选一
el_varstring使用 Edge 变量作为响应头值,与 value 二者选一
el_var_argstring如有需要,与 el_var 一同使用

响应头的值可通过 value 直接设置为固定值,或者通过 el_varel_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 的响应头。

删除响应头

参数说明

参数名数据类型是否必选描述
namestring要删除的响应头的名称

示例

- 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,则会将其删除。

输出响应体

参数说明

参数名数据类型是否必选描述
msgstring要输出的响应体内容

示例

- enable_rule: true
  conditions:
  - var: uri
    op: eq
    val: /hello/world

  actions:
    print:
      msg: |
        Hello World!

在此示例中,当请求的 URI 为 /hello/world 时,将会输出 Hello World! 作为响应体。

退出当前请求

参数说明

参数名数据类型是否必选描述
codenumberHTTP 响应状态码

示例

- enable_rule: true
  conditions:
  - var: uri
    op: eq
    val: /bad/request

  actions:
    exit:
      code: 403

在此示例中,当请求的 URI 为 /bad/request 时,将会以 403 状态码响应请求。

设置变量

参数说明

参数名数据类型是否必选描述
var_namestring变量名称
var_typestring变量类型,可选 app 和 global,分别表示应用用户变量和全局用户变量
valuestring变量的值

示例

- 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 语言

参数说明

参数名数据类型是否必选描述
elnumberEdgelagn 源码

示例

- enable_rule: true
  order: 12
  actions:
  - user-code:
      el: |-
        true =>
            say($or_user_variable_test),
            say($or_global_user_variable_uuid);

在此示例中,将应用用户变量 uuid 和全局用户变量 uuid作为请求的响应进行输出。

自定义错误页面

参数说明

参数名数据类型是否必选描述
statusarrayHTTP 状态码列表
content_typestring内容类型
file_pathstring静态文件路径
page_template_namestring页面模板的名称

示例

- 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_namestring全局自定义动作的名称

示例

- 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_typestring上游类型,可选 app 和 global,分别表示应用上游和全局上游
upstream_namestring上游名称
retriesnumber重试次数
retry_conditionarray重试条件,可选的重试条件有:error、timeout、invalid_header、http_500、http_502、http_504、http_503、http_404
typestring静态请求的类型,raw:镜像原始请求,custom:自定义 Lua 模块处理后的请求
module_namestring当 type 选择 custom 是,需要指定 Lua 模块的名称
algorithmstring负载均衡的算法,支持 chash、hash、roundrobin
send_timeoutnumber发送超时
conn_timeoutnumber连接超时
read_timeoutnumber读取超时

示例

- 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 的全局上游。