Page Rule Actions
Limit Request Rate
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
limit_key | string | Yes | Key for rate limiting, used to distinguish between different types of requests. See limit_key options for more information |
key_arg | string | No | Used in conjunction with limit_key , some limit_key require an additional parameter |
rate_shape | number | Yes | Request rate at which traffic shaping begins |
rate_shape_unit | string | Yes | Unit of traffic control, options: r/s (requests per second) and r/min (requests per minute) |
rate_reject | number | Yes | Request rate at which reject_action is executed to handle excessive requests |
rate_reject_unit | string | Yes | Unit for handling excessive requests, options: r/s (requests per second) and r/min (requests per minute) |
reject_action | string | Yes | Action executed when rate limit is exceeded, see reject_action options for more details |
error_page_status_code | string | No | When reject_action is error_page , this response status code must be set |
edge_captcha_clearance_time | string | Yes | When reject_action is enable_edge_captcha , this field must be set |
hcaptcha_clearance_time | string | Yes | When reject_action is enable_hcaptcha , this field must be set |
redirect_validate_clearance_time | string | Yes | When reject_action is redirect_validate , this field must be set |
limit_key
options:
- client-addr: Client address
- uri: Requested URI
- uri-arg: Request parameters
- req-cookie: Cookies in the request
- req-header: Request header
- first-x-forwarded-addr: The first address in the X-Forwarded-For header
- last-x-forwarded-addr: The last address in the X-Forwarded-For header
uri-arg
, req-cookie
, and req-header
should be used in conjunction with key_arg
to specify specific parameters and cookie or request header names.
reject_action
options:
- enable_hcaptcha: Enable hCaptcha verification
- enable_edge_captcha: Enable Edge Captcha verification
- error_page: Return the error page corresponding to the specified
error_page_status_code
- close_connection: Close the TCP connection directly
- redirect_validate: Perform redirect validation
- js_challenge: Execute a JS challenge
Example
- 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
The example demonstrates that request rate is limited based on the URI. When the request rate reaches 10 r/s, traffic shaping begins, meaning requests may be delayed; when the rate reaches 20 r/s, the excessive requests are rejected and an error page with the status code 429 is returned.
Circuit Breaker
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
strategy | string | Yes | The strategy adopted by the circuit breaker, options include slow-ratio, failure-ratio, and failure-count |
window_time | string | Yes | The sliding window duration for calculating the percentage of errors or slow responses in seconds |
open_time | number | Yes | The duration the circuit breaker remains open after tripping, during which all requests perform open_action in seconds |
hopen_time | string | Yes | The semi-open state duration, during which the circuit breaker attempts to recover by testing a limited number of requests in seconds |
failure_time | number | No | The time threshold considered for slow requests, in milliseconds |
failure_status | string | No | The list of status codes considered for failed requests, the optional status codes are: 401、403、404、414、502、503、503 |
failure_percent | string | No | The percentage threshold of failed or slow requests that trigger the tripping of the circuit breaker |
failure_count | string | No | The count threshold of failed requests that triggers the tripping of the circuit breaker |
min_reqs_in_window | string | Yes | The minimum number of requests reached within the sliding window period, used to calculate and trigger tripping |
open_action | string | Yes | The action performed when the circuit breaker is open; currently supported actions include exit (return default response) and redirect (redirect to an alternate service), etc. |
resp_status | string | No | When open_action is exit , the HTTP status code returned after the circuit breaker opens |
resp_body | string | No | When open_action is exit , the content of the response body returned after the circuit breaker opens |
redirect_url | string | No | When open_action is redirect , the URL the circuit breaker redirects to after opening |
Circuit breaker strategy options:
- slow-ratio: Slow request ratio, when the ratio of slow requests to normal requests reaches the threshold, the circuit breaker trips.
- failure-ratio: Failure request ratio, when the ratio of failed requests to normal requests reaches the threshold, the circuit breaker trips.
- failure-count: Failure request count, when the volume of failed requests reaches the threshold, the circuit breaker trips.
Example
- 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
This example uses a “failure request count” strategy circuit breaker. The circuit breaker is enabled when the URI is /hello
. If there are more than 5 requests in a 10-second window and 3 failures with status codes 500, 502, or 503, the circuit breaker will trip for 15 seconds. All requests will execute the exit
action during the trip and return a 500 status code. After 15 seconds of being tripped, it enters a semi-open state for 30 seconds, during which, if the first request is successful, it will return to an open state; otherwise, it will re-enter the tripped state.
Block Request
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
limit_key | string | Yes | Key for rate limiting, used to distinguish between different types of requests. See limit_key options for more information |
key_arg | string | No | Used in conjunction with limit_key , some limit_key require an additional parameter |
rate_shape | number | Yes | Request rate at which traffic shaping begins |
rate_shape_unit | string | Yes | Unit of traffic control, options: r/s (requests per second) and r/min (requests per minute) |
rate_reject | number | Yes | Request rate at which the requests are responded with a 503 |
rate_reject_unit | string | Yes | Unit for handling excessive requests, options: r/s (requests per second) and r/min (requests per minute) |
block_threshold | number | Yes | The threshold count of requests for blocking |
observe_interval | number | No | Observation period, in seconds |
block_time | number | No | Duration of the block, in seconds |
Within the observe_interval
observation period, if the number of limited requests reaches the block_threshold
, then requests identified by limit_key
will be blocked for a continuous block_time
seconds, directly responding with a 503.
More block actions will be supported in the future.
Example
- 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
In this example, requests are categorized based on the URI. When the request rate reaches 10 r/s, traffic shaping begins; when the rate hits 20 r/s, the excessive requests are rejected. If the rejected requests exceed the block threshold of 10 within a 60-second observation period, subsequent requests of this type will be directly responded to with a 503 status code and blocked for 3600 seconds.
OAuth JWT Validation
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
discovery | string | No | Discover configuration information through a URL, used as one of three options along with public_key and symmetric_key |
public_key | string | No | Public key for asymmetric encryption, used as one of three options along with discovery and symmetric_key |
symmetric_key | number | No | Private key for symmetric encryption, used as one of three options along with discovery and public_key |
token_signing_alg | array | Yes | The types of algorithms used for token verification, supports HS256, HS512, RS256, ES256, ES512, RS512, none, etc., multiple choices allowed |
accept_unsupported_alg | bool | Yes | Whether to accept unsupported algorithms |
Example
- 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
In this example, OAuth2 JWT validation is enabled when the request URI is /hello
. The key is discovered through a URL, all supported token signing algorithms are selected, and unsupported algorithms are rejected.
Enable Basic Authentication
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
group_name | string | Yes | The name of the group to which the Basic authentication user belongs |
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
enable-basic-authentication:
group_name: hello
In this example, Basic authentication is enabled when the request URI is /hello
, and only members of the hello
user group can access the corresponding resources.
Enable WebSocket
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
enable-websocket: {}
Set URI
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
uri | string | Yes | The new URI to be set |
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
set-uri:
uri: /world
In the example, when the request URI is /hello
, the URI will be changed to /world
.
Add URI Prefix
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
value | string | Yes | The URI prefix to be added |
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /world
actions:
add-uri-prefix:
value: /hello
In the example, when the request URI is /world
, the URI will be modified to /hello/world
.
Remove URI Prefix
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
value | string | Yes | The URI prefix to be removed |
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
rm-uri-prefix:
value: /hello
In the example, when the request URI is /hello/world
, the /hello
prefix will be removed from the URI, resulting in /world
.
Set Request Header
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
header | string | Yes | The name of the request header to be set |
value | string | Yes | The value of the request header to be set |
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
set-req-header:
header: Host
value: openresty.com
In the example, when the request URI is /hello/world
, the Host
request header will be modified to openresty.com
. It will be added if the Host
header does not exist.
Add Request Header
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
header | string | Yes | The name of the request header to be added |
value | string | Yes | The value of the request header to be added |
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
add-req-header:
header: Foo
value: Bar
In the example, when the request URI is /hello/world
, the Foo: Bar
request header will be added regardless of whether it already exists.
Remove Request Header
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
name | string | Yes | The name of the request header to remove |
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
rm-req-header:
name: Foo
In this example, when the request’s URI is /hello/world
, the system will remove the Foo
request header. If the request is proxied to the upstream server, the upstream server will not receive this header.
Set Proxy URI
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
uri | string | Yes | The proxy URI to set |
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello
actions:
set-proxy-uri:
uri: /hello/world
This example demonstrates that when the request’s URI is /hello
, the URI will be changed to /hello/world
in the proxy request, while the URI in the original request remains unchanged.
Set Proxy Header
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
header | string | Yes | The name of the proxy request header to set |
value | string | No | The value of the proxy request header to set, alternatively choose el_var |
el_var | string | No | Use an Edge variable as the request header value, alternatively choose value |
el_var_arg | string | No | If needed, use together with el_var |
The request header’s value can be set directly as a fixed value with value
, or dynamically with el_var
and el_var_arg
. The examples below will provide both scenarios.
el_var
supports variables including:
- client-addr: Client address
- client-port: Client port
- host: The hostname of the request
- scheme: The protocol of the HTTP request, can be
http
orhttps
- first-x-forwarded-addr: The first address in the X-Forwarded-For request header
- last-x-forwarded-addr: The last address in the X-Forwarded-For request header
- system-hostname: System hostname of the OpenResty Edge node
- req-header: A specified request header, the name of which is indicated by
el_var_arg
- ssl-client-s-dn: Holder information of the SSL client certificate
- ssl-client-i-dn: Issuing authority (CA) information of the SSL client certificate
- ssl-client-serial: Serial number of the SSL client certificate
- ssl-client-verify-result: Verification result of the SSL client certificate
Example
Example 1:
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
set-proxy-header:
header: Host
value: openresty.com
In this example, when the request’s URI is /hello/world
, the Host
request header for the proxy request will be set to openresty.com
. If there is no Host
request header, it will be added.
Example 2:
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
set-proxy-header:
header: X-Forwarded-For
el_var: client-addr
In this example, when the request’s URI is /hello/world
, the proxy request’s X-Forwarded-For
request header will be set to the actual client address.
Example 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
In this example, when the requested URI is /hello/world
, the Host
header from the original request headers will be set in the proxy request.
Set Response Header
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
name | string | Yes | The name of the response header to set |
value | string | No | The value of the response header to set, alternatively choose el_var |
el_var | string | No | Use an Edge variable as the response header value, alternatively choose value |
el_var_arg | string | No | If needed, use together with el_var |
The response header’s value can be set directly as a fixed value with value
or dynamically with el_var
and el_var_arg
. The examples below provide both scenarios.
el_var
supports variables including:
- system-hostname: System hostname of the OpenResty Edge node
- req-header: A specified request header, the name of which is indicated by
el_var_arg
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
set-resp-header:
name: Foo
value: Bar
In this example, when the request’s URI is /hello/world
, the response header Foo: Bar
will be set. If there is no Foo
response header, it will be added.
Add Response Header
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
name | string | Yes | The name of the response header to add |
value | string | No | The value of the response header to add, alternatively choose el_var |
el_var | string | No | Use an Edge variable as the response header value, alternatively choose value |
el_var_arg | string | No | If needed, use together with el_var |
The response header’s value can be set directly as a fixed value with value
or dynamically with el_var
and el_var_arg
. The examples below provide both scenarios.
el_var
supports variables including:
- system-hostname: System hostname of the OpenResty Edge node
- req-header: A specified request header, the name of which is indicated by
el_var_arg
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
add-resp-header:
name: Foo
value: Bar
In this example, regardless of whether the Foo
response header already exists, when the request’s URI is /hello/world
, an additional Foo: Bar
response header will be added.
Remove Response Header
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
name | string | Yes | The name of the response header to remove |
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
rm-resp-header:
name: Access-Control-Allow-Origin
In this example, when the request’s URI is /hello/world
, it will be removed if the response header contains Access-Control-Allow-Origin
.
Output Response Body
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
msg | string | Yes | The content of the response body to output |
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /hello/world
actions:
print:
msg: |
Hello World!
In this example, when the request’s URI is /hello/world
, Hello World!
will be the output of the response body.
Exit Current Request
Parameter Description
Parameter Name | Data Type | Required | Description |
---|---|---|---|
code | number | Yes | HTTP response status code |
Example
- enable_rule: true
conditions:
- var: uri
op: eq
val: /bad/request
actions:
exit:
code: 403
In this example, when the request’s URI is /bad/request
, the request will be responded to with a 403
status code.
Set Variable
Parameters
Parameter Name | Data Type | Required | Description |
---|---|---|---|
var_name | string | Yes | Variable name |
var_type | string | Yes | Variable type, options are ‘app’ and ‘global’, representing application user variables and global user variables respectively |
value | string | Yes | Value of the variable |
Example
- 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
In this example, the application user variable uuid
is set to hello
and the global user variable uuid
is set to world
.
Using Edgelang Language
Parameters
Parameter Name | Data Type | Required | Description |
---|---|---|---|
el | number | Yes | Edgelang source code |
Example
- enable_rule: true
order: 12
actions:
- user-code:
el: |-
true =>
say($or_user_variable_test),
say($or_global_user_variable_uuid);
In this example, the application user variable uuid
and global user variable uuid
are output as the response to the request.
Custom Error Page
Parameters
Parameter Name | Data Type | Required | Description |
---|---|---|---|
status | array | Yes | List of HTTP status codes |
content_type | string | Yes | Content type |
file_path | string | No | Static file path |
page_template_name | string | No | Name of the page template |
Example
- 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
This example includes two actions. One sets the error page for status code 404 to a static file with the path dir1/setup.sh
. The other sets the error page for status code 403 to a page template named page403
.
Custom Action
Parameters
Parameter Name | Data Type | Required | Description |
---|---|---|---|
global_action_name | string | Yes | Name of the global custom action |
Example
- enable_rule: true
actions:
- global_action:
global_action_name: global-action-1
- global_action:
global_action_name: global-action-2
This example includes two actions. One is a global custom action named global-action-1
, and the other is a global custom action named global-action-2
.
Mirror Request
Parameters
Parameter Name | Data Type | Required | Description |
---|---|---|---|
upstream_type | string | Yes | Upstream type, options are ‘app’ and ‘global’, representing application upstream and global upstream respectively |
upstream_name | string | Yes | Upstream name |
retries | number | No | Number of retries |
retry_condition | array | No | Retry conditions, available options are: error, timeout, invalid_header, http_500, http_502, http_504, http_503, http_404 |
type | string | No | Type of static request, ‘raw’: mirror original request, ‘custom’: request processed by custom Lua module |
module_name | string | No | When type is ‘custom’, specify the name of the Lua module |
algorithm | string | No | Load balancing algorithm, supports chash, hash, roundrobin |
send_timeout | number | No | Send timeout |
conn_timeout | number | No | Connection timeout |
read_timeout | number | No | Read timeout |
Example
- 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
In this example, the original request is mirrored to the global upstream named global_upstream_name1
.