# Create Rule

This command is used to create a page-rule.

# Usage

Usage: oredge rule create [http] [OPTIONS]

OPTIONS:
    --http string                      application http id.
    --action json                      action, can add mutilple times.
    --cache json                       cache. 
    --comment string                   comment.
    --condition json                   condition, can add mutilple times.
    --content json                     content.
    --last bool                        last, true or false.
    --order integer                    order.
    --proxy json                       proxy.
    --waf json                         waf.

GLOBAL OPTIONS:
    --help
    --show-api                         print restful api request.
    --json                             print json format.
    --config                           specify config file, default is ~/.oredge/config.

--http "http id"

Specify to which http application the rule is created.

You can specify it in two method

    oredge rule create 1

or

    oredge rule create --http 1

--comment "description string"

You can add a description to this rule

--condition "json string"

This parameter can be used to add multiple conditions to hit the rule.

The condition is a json string.

Goto condition definition
Goto condition example

--action "json string"

This parameter can be used to add multiple actions to the request.

The action is a json string.

Goto action definition
Goto action example

--last "true"

Skip any subsequent page rules when this rule matches, default is false.

--order position

The order of the rule

--content "json"

This parameter set the static content of the rule.

Goto content example

--cache "json"

This parameter configure the cache of the rule.

Goto cache definition
Goto cache example

--proxy "json string"

This parameter can be used to add proxy to the specified upstream.

The proxy is a json string.

Goto proxy definition
Goto proxy example

--waf "json string"

This parameter can be used to add waf configuration of the rule.

The waf is a json string.

Goto waf definition
Goto waf example

# condition definition:
name type required description
variable object yes see variable definition
operator object yes see operator definition
values array yes an array of value, see value definition
caseless bool yes case-insensitive
# variable definition:
name type required description
name string no variable name, see variable list
user_var integer no user variable
global_var integer no global variable
args string no some variables needs args, see variable list

Note: only one of name, user_var, global_var must be set.

# operator definition:
name type required description
name string yes the name of the operator, see operator list
# value definition:
name type required description
type string yes str,rx,wc,netaddr,uv,global-uv,ip-list, see operator list
val string yes
# variable list:
name need args args operators description
uri no eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix URI
uri-arg yes string eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix,==,!=,<,<=,>,>=,is-empty,!is-empty URI argument
uri-seg yes integer eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix,==,!=,<,<=,>,>=,is-empty,!is-empty URI segment
query-string no eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix Query string
sorted-query-string no eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix Sorted URI argument
host no eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix Host
req-method no eq,ne Request method
req-cookie yes string eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix,==,!=,<,<=,>,>=,is-empty,!is-empty Request cookie
req-header yes string eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix,==,!=,<,<=,>,>=,is-empty,!is-empty Request header
scheme no eq,ne Scheme
server-port no ==,!=,<,<=,>,>= Server Port
server-addr no ~~,!~~,eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix Server address
first-x-forwarded-addr no ~~,!~~,eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix First address in X-Forwarded-For
last-x-forwarded-addr no ~~,!~~,eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix Last address in X-Forwarded-For
user-agent no eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix,==,!=,<,<=,>,>=,is-empty,!is-empty User agent
User agent is mobile no is-true,!is-true User agent is mobile
client-continent yes string eq,ne Client continent
client-country yes string eq,ne Client country/region
client-province yes string eq,ne Client provinces (China)
client-city yes string eq,ne Client city
client-addr no ~~,!~~,eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix Client address
ssl-client-s-dn no eq,ne,lt,le,gt,ge,contains,contains-word,prefix,suffix,!contains,!contains-word,!prefix,!suffix,==,!=,<,<=,>,>=,is-empty,!is-empty SSL Client Subject DN
# Operator list:

Different operator support different value types.

operator value type
eq str,rx,wc
ne str,rx,wc
lt str
le str
gt str
ge str
contains str,rx,wc
contains-word str,rx,wc
prefix str,rx,wc
suffix str,rx,wc
!contains str,rx,wc
!contains-word str,rx,wc
!prefix str,rx,wc
!suffix str,rx,wc
== str
!= str
< str
<= str
> str
>= str
s-empty
!is-empty
is-true
!is-true
~~ netaddr,ip-list
!~~ netaddr,ip-list
# action definition:
name type description
type string action type
? object the name is equal to value of type,
for example '{type: "set-uri", set-uri: {...}}'
# action list:
  1. set-uri

Set URI

name type description
uri string
  1. add-uri-prefix

Add URI prefix

name type description
value string
  1. rm-uri-prefix

Remove URI prefix

name type description
value string
  1. rm-uri-seg

Remove URI segment

name type description
value integer
  1. set-req-header

Set request header

name type description
header string
value string
  1. add-req-header

Add request header

name type description
header string
value string
  1. set-uri-arg

Set URI argument

name type description
arg string
value string
  1. add-uri-arg

Add URI argument

name type description
arg string
value string
  1. rm-uri-arg

Remove URI argument

name type description
name string
  1. set-proxy-uri

Set proxy URI

name type description
value string
arg string
  1. rewrite-proxy-uri-prefix

Rewrite proxy URI prefix

name type description
prefix string
replacement string
  1. set-proxy-header

Set proxy header

name type description
header string
value string
el_var string
  1. append-proxy-header-value

Append proxy header value

name type description
header string
value string
el_var string
  1. enable-proxy-cache-revalidate

Enable proxy cache revalidate

name type description
enabled string
  1. set-proxy-cache-use-stale

Use stale proxy cache

name type description
value string
  1. redirect

Redirect

name type description
args string
code string
host string
port string
scheme string
url string
  1. print

Print

name type description
content_type string
  1. exit

Exit

name type description
code string
  1. send-static-file

Return static file

name type description
start_index string
end_index string
  1. sleep

sleep

name type description
time string
  1. limit-req-rate

Limit request rate

name type description
edge_captcha_clearance_time string
error_page_status_code string
hcaptcha_clearance_time string
limit_key string
rate_reject string
rate_reject_unit string
rate_shape string
rate_shape_unit string
reject_action string
  1. limit-req-count

Limit request count

name type description
count_reject string
count_time_window string
limit_key string
  1. block-req

Block request

name type description
block_threshold string
block_time string
limit_key string
observe_interval string
rate_reject string
rate_reject_unit string
rate_shape string
rate_shape_unit string
  1. set-resp-header

Set response header

name type description
name string
value string
el_var_arg string
  1. add-resp-header

Add response header

name type description
name string
value string
el_var_arg string
  1. rm-resp-header

Remove response header

name type description
name string
  1. apply-std-mime-types
name type description
force bool
  1. expires
name type description
force bool
max_age integer
max_age_unit string
  1. set-resp-cookie
name type description
el_var_arg string
http_only integer
max_age string
max_age_unit string
name string
path string
value string
  1. limit-resp-data-rate
name type description
rate string
rate_unit integer
  1. user-code
name type description
el string
  1. enable-openidc-authentication
name type description
client_id string
client_secret string
discovery string
logout_path string
redirect_uri string
scope string
ssl_verify string
timeout string
timeout_unit string
token_endpoint_auth_method string
  1. enable-websocket

  2. enable-gateway-brotli

name type description
enabled bool
  1. enable-gateway-gzip
name type description
enabled bool
  1. intercept-upstream-errors
name type description
enabled bool
  1. errlog
name type description
level string
msg string
  1. set-brotli-types
name type description
types array
  1. set-gzip-types
name type description
types array
  1. set-max-body-size
name type description
value integer
unit string
  1. set-var
name type description
global_var_id integer
value string
  1. user-code
name type description
el string
# cache definition:
name type description
browserCache bool
browser_ttl integer
browser_ttl_unit string
cluster_hash bool Use consistent hashing to share the response cache in each gateway cluster.
default_ttls array
cache_key array the key of cache content, see cache key list
enableDefaultTtl bool When disabled (which is the default), we won't cache responses without any cache controlling headers like Expires and Cache-Control. When enabled, we will cache these responses with force. If the backend servers explicitly disable caching, then the cache will still be bypassed even when this option is enabled.
# cache key list:
name need args
uri no
uri-arg yes
uri-seg yes
query-string no
sorted-query-strin no
req-method no
req-cookie yes
req-header yes
scheme no
first-x-forwarded-addr no
last-x-forwarded-addr no
user-agent no
ua-is-mobile no
client-continent no
client-province no
client-city no
client-isp no
ssl-client-s-dn no
# proxy definition
name type description
balancer object balancer algorithm
upstream object
backup_upstream object
upstream_el_code string you can use edgelang instead of upstream and backup_upstream
connect_timeout integer
connect_timeout_unit string s,ms
read_timeout integer
read_timeout_unit string s,ms
send_timeout integer
send_timeout_unit string s,ms
layer_policy integer
retries integer set to -1 means same as the number of upstream nodes.
retry_condition array array of string, value must be error,timeout,invalid_header,http_500,http_502,http_504
sticky object
# balancer
name type description
algorithm string one of hash,chash,roundrobin
variables array if algorithm is hash or chash, this field is required.
# variables

Variables is an array of object.

the object is like this: '{"name" : "uri" }' or '{"name" : "uri-arg", "args" : "foo"}'

the name of object is list below:

name need args
uri no
uri-arg yes
uri-seg yes
query-string no
sorted-query-strin no
req-method no
req-cookie yes
req-header yes
scheme no
first-x-forwarded-addr no
last-x-forwarded-addr no
user-agent no
ua-is-mobile no
client-continent no
client-province no
client-city no
client-isp no
ssl-client-s-dn no

If the variable need args, the variable object is like this: '{"name" : "uri-arg", "args" : "foo" }'

# upstream
name type description
cluster integer upstream id
global_cluster integer global upstream id
k8s_cluster integer k8s upstream id
global_k8s_cluster integer global k8s upstream id
weight integer weight of the upstream
# sticky
name type description
enable bool
key string
level string upstream,server
ttl integer

# Example

# Condition example
  1. uri example
> oredge create page-rule 1 \
    --condition '{"variable":{"name":"uri"},"operator":{"name":"eq"},"values":[{"type":"str","val":"/a/b"}]}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }' 
ID: 1-1

  1. uri-arg example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"variable":{"name":"uri-arg","args":"foo"},"values":[{"type":"str","val":"bar"}]}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1

  1. uri-seg example
> oredge create page-rule 1 \
    --condition '{"variable":{"name":"uri-seg","args":"1"},"operator":{"name":"eq"},"values":[{"type":"str","val":"foo"}]}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1

  1. query-string example
> oredge create page-rule 1 \
    --condition '{"variable":{"name":"query-string"},"operator":{"name":"prefix"},"values":[{"type":"str","val":"foo"}]}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. sorted-query-string example
> oredge create page-rule 1 \
    --condition '{"variable":{"name":"sorted-query-string"},"values":[{"type":"str","val":"foo"}],"operator":{"name":"prefix"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. host example
> oredge create page-rule 1 \
    --condition '{"variable":{"name":"host"},"values":[{"type":"str","val":"foo"}],"operator":{"name":"eq"},"caseless":true}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. req-method example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"values":[{"type":"str","val":"GET"}],"caseless":false,"variable":{"name":"req-method"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. req-cookie example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"values":[{"type":"str","val":"bar"}],"variable":{"name":"req-cookie","args":"foo"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. req-header example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"values":[{"type":"str","val":"bar"}],"variable":{"name":"req-header","args":"foo"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. scheme example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"values":[{"type":"str","val":"http"}],"variable":{"name":"scheme"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. server-port example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"=="},"values":[{"type":"str","val":"80"}],"variable":{"name":"server-port"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. server-addr example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"values":[{"type":"str","val":"192.168.0.1"}],"variable":{"name":"server-addr"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. first-x-forwarded-addr example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"~~"},"values":[{"type":"netaddr","val":"192.168.0.1"}],"variable":{"name":"first-x-forwarded-addr"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"~~"},"values":[{"type":"ip-list","val":"15"}],"variable":{"name":"first-x-forwarded-addr"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. last-x-forwarded-addr example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"~~"},"values":[{"type":"netaddr","val":"192.168.0.1"}],"variable":{"name":"last-x-forwarded-addr"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"~~"},"values":[{"type":"ip-list","val":"15"}],"variable":{"name":"last-x-forwarded-addr"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. user-agent example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"values":[{"type":"str","val":"foo"}],"variable":{"name":"user-agent"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. ua-is-mobile example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"is-true"},"variable":{"name":"ua-is-mobile"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"!is-true"},"variable":{"name":"ua-is-mobile"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. client-continent example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"variable":{"name":"client-continent"},"values":[{"type":"str","val":"AF"}]}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. client-country example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"values":[{"type":"str","val":"UK"}],"variable":{"name":"client-country"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. client-province example
> oredge create page-rule 1 \
    --condition '{"values":[{"type":"str","val":"Beijing"}],"operator":{"name":"eq"},"variable":{"name":"client-province"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. client-city example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"values":[{"type":"str","val":"London"}],"variable":{"name":"client-city"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. client-addr example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"values":[{"type":"str","val":"192.168.1.1"}],"variable":{"name":"client-addr"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. ssl-client-s-dn example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"values":[{"type":"str","val":"foo.com"}],"variable":{"name":"ssl-client-s-dn"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. global user variable example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"values":[{"type":"str","val":"foo"}],"variable":{"global_var":7}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. gateway-cluster example
> oredge create page-rule 1 \
    --condition '{"operator":{"name":"eq"},"values":[{"type":"str","val":"1"}],"variable":{"name":"gateway-cluster"}}' \
    --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
# Action example
  1. set-uri example
> oredge create page-rule 1 --action '{ "type": "set-uri", "set-uri": { "uri": "/foo/bar" } }'

ID: 1-1
  1. add-uri-prefix example
> oredge create page-rule 1 --action '{"type":"add-uri-prefix","add-uri-prefix":{"value":"/foo"}}'

ID: 1-1
  1. rm-uri-prefix example
> oredge create page-rule 1 --action '{"type":"rm-uri-prefix","rm-uri-prefix":{"value":"/foo"}}'

ID: 1-1
  1. rm-uri-seg example
> oredge create page-rule 1 --action '{"type":"rm-uri-seg","rm-uri-seg":{"index":1}}'

ID: 1-1
  1. set-req-header example
> oredge create page-rule 1 --action '{"type":"set-req-header","set-req-header":{"header":"foo","value":"bar"}}'

ID: 1-1
  1. add-req-header example
> oredge create page-rule 1 --action '{"type":"add-req-header","add-req-header":{"header":"foo","value":"bar"}}'

ID: 1-1
  1. set-uri-arg example
> oredge create page-rule 1 --action '{"type":"set-uri-arg","set-uri-arg":{"arg":"foo","value":"bar"}}'

ID: 1-1
  1. add-uri-arg example
> oredge create page-rule 1 --action '{"type":"add-uri-arg","add-uri-arg":{"arg":"foo","value":"bar"}}'

ID: 1-1
  1. rm-uri-arg example
> oredge create page-rule 1 --action '{"type":"rm-uri-arg","rm-uri-arg":{"name":"foo"}}'

ID: 1-1
  1. set-proxy-uri example
> oredge create page-rule 1 --action '{"type":"set-proxy-uri","set-proxy-uri":{"uri":"/foo"}}'

ID: 1-1
  1. rewrite-proxy-uri-prefix example
> oredge create page-rule 1 --action '{"type":"rewrite-proxy-uri-prefix","rewrite-proxy-uri-prefix":{"prefix":"/foo","replacement":"/bar"}}'

ID: 1-1
  1. set-proxy-header example
> oredge create page-rule 1 --action '{"type":"set-proxy-header","set-proxy-header":{"header":"Host","value":"foo"}}'

ID: 1-1
  1. append-proxy-header-value example
> oredge create page-rule 1 --action '{"type":"append-proxy-header-value","append-proxy-header-value":{"el_var":"client-addr","header":"X-Forwarded-For"}}'

ID: 1-1
  1. enable-proxy-cache-revalidate example
> oredge create page-rule 1 --action '{"type":"enable-proxy-cache-revalidate","enable-proxy-cache-revalidate":{"enabled":true}}'

ID: 1-1
  1. set-proxy-cache-use-stale example
> oredge create page-rule 1 --action '{"type":"set-proxy-cache-use-stale","set-proxy-cache-use-stale":{"args":["error","timeout","invalid_header","updating","http_500","http_502","http_503","http_504","http_403","http_404","http_429"]}}'

ID: 1-1
  1. redirect example
> oredge create page-rule 1 --action '"type":"redirect","redirect":{"scheme":"http","port":80,"url":"/foo","args":"foo=bar","host":"foo.com","code":302}}'

ID: 1-1
  1. print example
> oredge create page-rule 1 --action '{"type":"print","print":{"msg":"<!doctype html>\n<html>\n<head>\n  <title>Response</title>\n</head>\n<body>\n</body>\n</html>","content_type":"text/html"}}'

ID: 1-1
  1. exit example
> oredge create page-rule 1 --action '{"type":"exit","exit":{"code":204}}'

ID: 1-1
  1. send-static-file example
> oredge create page-rule 1 --action '{"type":"send-static-file","send-static-file":{"start_index":1,"end_index":2}}'

ID: 1-1
  1. sleep example
> oredge create page-rule 1 --action '{"type":"sleep","sleep":{"time":2}}'

ID: 1-1
  1. limit-req-rate example
> oredge create page-rule 1 --action '{"type":"limit-req-rate","limit-req-rate":{"limit_key":"client-addr","rate_shape":1,"rate_shape_unit":"r/s","rate_reject":1,"rate_reject_unit":"r/s","reject_action":"error_page","error_page_status_code":503,"hcaptcha_clearance_time":60,"edge_captcha_clearance_time":60}}'

ID: 1-1
  1. limit-req-count example
> oredge create page-rule 1 --action '{"type":"limit-req-count","limit-req-count":{"limit_key":"client-addr","count_reject":10,"count_time_window":1}}'

ID: 1-1
  1. block-req example
> oredge create page-rule 1 --action '{"type":"block-req","block-req":{"limit_key":"client-addr","rate_shape":1,"rate_shape_unit":"r/s","rate_reject":1,"rate_reject_unit":"r/s","block_threshold":2,"observe_interval":5,"block_time":60}}'

ID: 1-1
  1. global action example
> oredge create page-rule 1 --action '{"global_action_id":1}'

ID: 1-1
  1. set-resp-header example
> oredge create page-rule 1 --action '{"type":"set-resp-header","set-resp-header":{"name":"foo","value":"bar"}}'

ID: 1-1
  1. add-resp-header example
> oredge create page-rule 1 --action '{"type":"add-resp-header","add-resp-header":{"name":"foo","value":"bar"}}'

ID: 1-1
  1. rm-resp-header example
> oredge create page-rule 1 --action '{"type":"rm-resp-header","rm-resp-header":{"name":"foo"}}'

ID: 1-1
  1. apply-std-mime-types example
> oredge create page-rule 1 --action '{"type":"apply-std-mime-types","apply-std-mime-types":{"force":true}}'

ID: 1-1
  1. expires example
> oredge create page-rule 1 --action '{"type":"expires","expires":{"max_age":1,"max_age_unit":"hour","force":true}}'

ID: 1-1
  1. set-resp-cookie example
> oredge create page-rule 1 --action '{"type":"set-resp-cookie","set-resp-cookie":{"http_only":true,"max_age":1,"max_age_unit":"hour","name":"foo","el_var":"userid","domain":"bar.com","path":"/foo/bar"}}'

ID: 1-1
  1. limit-resp-data-rate example
> oredge create page-rule 1 --action '{"type":"limit-resp-data-rate","limit-resp-data-rate":{"rate_unit":"kB/s","rate":10}}'

ID: 1-1
  1. set-error-page example
> oredge create page-rule 1 --action '{"type":"set-error-page","set-error-page":{"type":"raw-content","content_type":"text/html; charset=utf8","content":"<!doctype html>\n<html lang=\"en\">\n<head>\n  <title>404 NOT FOUND</title>\n</head>\n<body>\n</body>\n</html>","status":[403,404,500,502,503,504]}}'

ID: 1-1
  1. disable-req-buffering example
> oredge create page-rule 1 --action '{"type":"disable-req-buffering","disable-req-buffering":{}}'

ID: 1-1
  1. enable-basic-authentication example
> oredge create page-rule 1 --action '{"type":"enable-basic-authentication","enable-basic-authentication":{"app_auth_id":3}}'

ID: 1-1
  1. enable-openidc-authentication example
> oredge create page-rule 1 --action '{"type":"enable-openidc-authentication","enable-openidc-authentication":{"token_endpoint_auth_method":"client_secret_basic","scope":"openid","ssl_verify":false,"timeout":1000,"timeout_unit":"ms","logout_path":"/logout","client_id":"foo","client_secret":"bar","discovery":"http://foo.com/a/b","redirect_uri":"http://foo.com/c/d"}}'

ID: 1-1
  1. enable-websocket example
> oredge create page-rule 1 --action '{"type":"enable-websocket","enable-websocket":{}}'

ID: 1-1
  1. enable-gateway-brotli example
> oredge create page-rule 1 --action '{"type":"enable-gateway-brotli","enable-gateway-brotli":{"enabled":true}}'

ID: 1-1
  1. enable-gateway-gzip example
> oredge create page-rule 1 --action '{"type":"enable-gateway-gzip","enable-gateway-gzip":{"enabled":true}}'

ID: 1-1
  1. intercept-upstream-errors example
> oredge create page-rule 1 --action '{"type":"intercept-upstream-errors","intercept-upstream-errors":{"enabled":true}}'

ID: 1-1
  1. errlog example
> oredge create page-rule 1 --action '{"type":"errlog","errlog":{"level":"error","msg":"foo"}}'

ID: 1-1
  1. set-brotli-types example
> oredge create page-rule 1 --action '{"type":"set-brotli-types","set-brotli-types":{"types":["foo", "bar"]}}'

ID: 1-1
  1. set-gzip-types example
> oredge create page-rule 1 --action '{"type":"set-gzip-types","set-gzip-types":{"types":["foo","bar"]}}'

ID: 1-1
  1. set-max-body-size example
> oredge create page-rule 1 --action '{"type":"set-max-body-size","set-max-body-size":{"value":1,"unit":"mB"}}'

ID: 1-1
  1. set-var example
> oredge create page-rule 1 --action '{"type":"set-var","set-var":{"global_var_id":5,"value":"yes"}}'

ID: 1-1
  1. user-code example
> oredge create page-rule 1 --action '{"type":"user-code","user-code":{"el":"my Str $s = \"hello world\";"}}'

ID: 1-1
# Content example
  1. set the content
> oredge create page-rule 1 --content '{"content":{"favicon":12}}'

ID: 1-1
# Cache example
> oredge create page-rule 1 --cache '{"cache_key":[{"name":"uri"},{"name":"query-string"},{"name":"uri-seg","args":"1"}],"enableDefaultTtl":true,"enforce_cache":false,"cluster_hash":true,"enableConvertHead":true,"enable_global":true,"browserCache":true,"browser_ttl":1,"browser_ttl_unit":"min","disable_convert_head":false,"default_ttls":[{"ttl":1,"ttl_unit":"min","status":200}]}' \
    --proxy '{"upstream":[{"cluster":1836,"weight":1,"upstream":null}],"backup_upstream":[],"upstream_el_code":"","balancer":{"algorithm":"roundrobin","variables":[]},"useSameBalancingPolicy":true,"sticky":{"enable":false,"key":"Edge-Sticky","level":"upstream","ttl":0,"mode":"none"},"retry_condition":["error","timeout","invalid_header","http_500","http_502","http_504"],"connect_timeout":6,"connect_timeout_unit":"s","send_timeout":6,"send_timeout_unit":"s","read_timeout":6,"read_timeout_unit":"s","retries":1,"layer_policy":null,"balancer2":null}'

# Proxy example
  1. proxy a upstream
> oredge create page-rule 1 --proxy '{"upstream":[{"cluster":1836,"weight":1}],"backup_upstream":[],"upstream_el_code":"","balancer":{"algorithm":"roundrobin","variables":[]},"useSameBalancingPolicy":true,"sticky":{"enable":false,"key":"Edge-Sticky","level":"upstream","ttl":0,"mode":"none"},"retry_condition":["error","timeout","invalid_header","http_500","http_502","http_504"],"connect_timeout":6,"connect_timeout_unit":"s","send_timeout":6,"send_timeout_unit":"s","read_timeout":6,"read_timeout_unit":"s","retries":1,"layer_policy":null,"balancer2":null}' \
    --condition '{"variable":{"name":"uri"},"operator":{"name":"eq"},"values":[{"type":"str","val":"/a/b"}]}'

  1. proxy a global upstream
> oredge create page-rule 1 --proxy '{"upstream":[{"global_cluster":1836,"weight":1}],"backup_upstream":[],"upstream_el_code":"","balancer":{"algorithm":"roundrobin","variables":[]},"useSameBalancingPolicy":true,"sticky":{"enable":false,"key":"Edge-Sticky","level":"upstream","ttl":0,"mode":"none"},"retry_condition":["error","timeout","invalid_header","http_500","http_502","http_504"],"connect_timeout":6,"connect_timeout_unit":"s","send_timeout":6,"send_timeout_unit":"s","read_timeout":6,"read_timeout_unit":"s","retries":1,"layer_policy":null,"balancer2":null}' \
    --condition '{"variable":{"name":"uri"},"operator":{"name":"eq"},"values":[{"type":"str","val":"/a/b"}]}'

  1. proxy a k8s upstream
> oredge create page-rule 1 --proxy '{"upstream":[{"k8s_cluster":1836,"weight":1}],"backup_upstream":[],"upstream_el_code":"","balancer":{"algorithm":"roundrobin","variables":[]},"useSameBalancingPolicy":true,"sticky":{"enable":false,"key":"Edge-Sticky","level":"upstream","ttl":0,"mode":"none"},"retry_condition":["error","timeout","invalid_header","http_500","http_502","http_504"],"connect_timeout":6,"connect_timeout_unit":"s","send_timeout":6,"send_timeout_unit":"s","read_timeout":6,"read_timeout_unit":"s","retries":1,"layer_policy":null,"balancer2":null}' \
    --condition '{"variable":{"name":"uri"},"operator":{"name":"eq"},"values":[{"type":"str","val":"/a/b"}]}'

  1. proxy a global k8s upstream
> oredge create page-rule 1 --proxy '{"upstream":[{"global_k8s_cluster":1836,"weight":1}],"backup_upstream":[],"upstream_el_code":"","balancer":{"algorithm":"roundrobin","variables":[]},"useSameBalancingPolicy":true,"sticky":{"enable":false,"key":"Edge-Sticky","level":"upstream","ttl":0,"mode":"none"},"retry_condition":["error","timeout","invalid_header","http_500","http_502","http_504"],"connect_timeout":6,"connect_timeout_unit":"s","send_timeout":6,"send_timeout_unit":"s","read_timeout":6,"read_timeout_unit":"s","retries":1,"layer_policy":null,"balancer2":null}' \
    --condition '{"variable":{"name":"uri"},"operator":{"name":"eq"},"values":[{"type":"str","val":"/a/b"}]}'

# Waf example
oredge create page-rule 1 --waf '{"rule_sets":[6,8,14,15],"action":"log","threshold_score":100}' \
    --condition '{"variable":{"name":"uri"},"operator":{"name":"eq"},"values":[{"type":"str","val":"/a/b"}]}'