頁面規則 - 動作
限制請求速率
引數說明
引數名 | 資料型別 | 是否必選 | 描述 |
---|---|---|---|
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
的全域性上游。