概述
目前云原生網關共支持8種插件配置,可以滿足用戶的身份認證、流量控制、安全、信息重寫等需求。每個插件的配置詳情與使用方式可參考以下介紹。
身份認證類
key-auth插件
描述
key-auth 是一個認證插件,在header或者query中匹配key值即可通過認證
作用范圍
該插件即可用于全局插件,也可用于路由級插件。全局插件配置的優先級高于路由級插件配置,當同時在某一路由上配置了key-auth的全局插件和路由級插件時,需帶上全局插件配置中的key值才能通過。
屬性
| 名稱 | 類型 | 必選項 | 默認值 | 有效值 | 描述 |
|---|---|---|---|---|---|
| key | string | 必需 | -- | -- | 在header或者query中通過apikey攜帶key值進行認證。 |
如何啟用
在配置窗口頁以YAML格式填寫
配置示例
下面是一個示例,填寫key-auth配置信息:
“key”:”test”
啟用/停用
在配置頁面設置生效開關
驗證插件
未啟用插件時API請求結果
$ curl -i //198.20.4.150:27151/apitest
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Date: Fri, 23 Dec 2022 03:53:53 GMT
Server: APISIX/2.13.3
rspTest: hello,world
[{"id":1,"productID":1,"reviewer":"Reviewer1","text":"THIS IS A GRAY VERSION "}]
啟用插件不帶apikey時API的請求結果
$ curl -i //198.20.4.150:27151/apitest
HTTP/1.1 401 Unauthorized
Date: Fri, 23 Dec 2022 03:54:31 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.13.3
{"message":"Missing API key found in request"}
啟用插件帶apikey時API的請求結果
apikey的位置可以在header中也可以在query中
- 在header中使用
$ curl -i //198.20.4.150:27151/apitest -H "apikey: test"
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Date: Fri, 23 Dec 2022 03:54:55 GMT
Server: APISIX/2.13.3
rspTest: hello,world
[{"id":1,"productID":1,"reviewer":"Reviewer1","text":"THIS IS A GRAY VERSION"}]
- 在query中使用
$ curl -i //198.20.4.150:27151/apitest?apikey=test
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Date: Fri, 23 Dec 2022 03:55:28 GMT
Server: APISIX/2.13.3
rspTest: hello,world
[{"id":1,"productID":1,"reviewer":"Reviewer1","text":"An extremely entertaining play by Shakespeare"}]
basic-auth插件
描述
Basic-auth 是一個認證插件,匹配指定的用戶名和密碼即可通過認證。
作用范圍
該插件即可用于全局插件,也可用于路由級插件。全局插件配置的優先級高于路由級插件配置,當同時在某一路由上配置了basic-auth的全局插件和路由級插件時,需正確帶上全局插件配置中的用戶名和密碼值才能通過。
屬性
consumer 端配置
| 名稱 | 類型 | 必選項 | 描述 |
|---|---|---|---|
| username | string | 必須 | 用戶名 |
| password | string | 必須 | 用戶的密碼 |
如何啟用
在配置窗口頁以YAML格式填寫
配置示例
填寫basic-auth的配置信息
username: "xxx"
password: "********"
啟用/停用
在配置頁面設置生效開關
驗證插件
未啟用插件時API請求結果
$ curl -i //198.20.4.150:27151/apitest
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Date: Fri, 23 Dec 2022 03:53:53 GMT
Server: APISIX/2.13.3
rspTest: hello,world
[{"id":1,"productID":1,"reviewer":"Reviewer1","text":"THIS IS A GRAY VERSION "}]
啟用插件時API請求結果
- 缺少 Authorization header
$ curl -i //198.20.4.150:27151/apitest
HTTP/1.1 401 Unauthorized
Date: Fri, 23 Dec 2022 04:23:56 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
WWW-Authenticate: Basic realm='.'
Server: APISIX/2.13.3
{"message":"Missing authorization in request"}
- 用戶名不存在
$ curl -i -umse:msegW@9527 //198.20.4.150:27151/apitest
HTTP/1.1 401 Unauthorized
Date: Fri, 23 Dec 2022 04:25:08 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.13.3
{"message":"Invalid user key in authorization"}
- 密碼錯誤
$ curl -i -umsegw:msegW //198.20.4.150:27151/apitest
HTTP/1.1 401 Unauthorized
Date: Fri, 23 Dec 2022 04:25:49 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.13.3
{"message":"Password is error"}
- 成功請求
$ curl -i -umsegw:msegW@9527 //198.20.4.150:27151/apitest
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Date: Fri, 23 Dec 2022 04:26:16 GMT
Server: APISIX/2.13.3
rspTest: hello,world
[{"id":1,"productID":1,"reviewer":"Reviewer1","text":"An extremely entertaining play by Shakespeare. "}]
流量控制類
并發限制limit-conn插件
描述
限制并發請求(或并發連接)插件。
作用范圍
該插件即可用于全局插件,也可用于路由級插件。全局插件配置的優先級高于路由級插件配置,當同時在某一路由上配置了limit-conn的全局插件和路由級插件時,以全局插件配置中設置的屬性值為準。
屬性
| 名稱 | 類型 | 必選項 | 默認值 | 有效值 | 描述 |
|---|---|---|---|---|---|
| conn | integer | 是 | -- | conn > 0 | 允許的最大并發請求數。超過conn 的限制、但是低于conn +burst 的請求,將被延遲處理。 |
| burst | integer | 是 | -- | burst >= 0 | 允許被延遲處理的并發請求數。 |
| default_conn_delay | number | 是 | -- | default_conn_delay > 0 | 默認的典型連接(或請求)的處理延遲時間。 |
| only_use_default_delay | boolean | 否 | false | [true,false] | 延遲時間的嚴格模式。如果設置為true的話,將會嚴格按照設置的時間來進行延遲。 |
| key_type | string | 否 | "var" | ["var", "var_combination"] | key 的類型。 |
| key | string | 是 | -- | -- | 用來做請求計數的依據。 如果key_type 為"var",那么 key 會被當作變量名稱,如 "remote_addr" 和 "consumer_name"。 如果key_type 為"var_combination",那么 key 會當作變量組合,如 "remote_addr consumer_name"。 如果 key 的值為空,$remote_addr 會被作為默認 key。 |
| rejected_code | string | 否 | 503 | [200,...,599] | 當請求超過conn +burst 這個閾值時,返回的HTTP 狀態碼。 |
| rejected_msg | string | 否 | -- | 非空 | 當請求超過conn +burst 這個閾值時,返回的響應體。 |
| allow_degradation | boolean | 否 | false | -- | 當插件功能臨時不可用時是否允許請求繼續。當值設置為true 時則自動允許請求繼續,默認值是 false。 |
如何使用
在配置窗口頁以YAML格式填寫
配置示例
下面是一個示例,開啟 limit-conn 插件,并設置 key_type 為var:
conn: 1
burst: 0
default_conn_delay: 0.1
rejected_code: 503
key_type: "var"
key: "remote_addr"
下面是一個示例,開啟了 limit-conn 插件,并設置 key_type 為var_combination:
conn: 1
burst: 0
default_conn_delay: 0.1
rejected_code: 503
key_type: "var_combination"
key: "$consumer_name $remote_addr"
停用/啟用
在配置頁面設置生效開關
驗證插件
上面啟用的插件的參數表示只允許一個并發請求。當收到多個并發請求時,將直接返回 503 拒絕請求。
curl -i //127.0.0.1:9080/index.html?sleep=20
503 Service Temporarily Unavailable
# 503 Service Temporarily Unavailable
---
openresty
這就表示 limit-conn 插件已經生效了。
限流limit-count插件
描述
在指定的時間范圍內,限制總的請求個數。并且在 HTTP 響應頭中返回剩余可以請求的個數,支持本地限流和全局限流兩種限流方式。
當前配置模版中配置了三種模版可供選擇:
- 基礎配置為本地限流策略,云原生網關每個節點單獨計算限流次數。整個集群的限流計數為配置的count 節點數。
- Redis單節點配置和Redis集群配置兩種配置都是云原生網關的全局限流配置,此時count配置為集群全局限流計數。
作用范圍
該插件即可用于全局插件,也可用于路由級插件。全局插件配置的優先級高于路由級插件配置,當同時在某一路由上配置了limit-count的全局插件和路由級插件時,以全局插件配置中設置的屬性值為準。
屬性
| 名稱 | 類型 | 必選項 | 默認值 | 有效值 | 描述 |
|---|---|---|---|---|---|
| count | integer | 必須 | -- | count > 0 | 指定時間窗口內的請求數量閾值。 |
| time_window | integer | 必須 | -- | time_window > 0 | 時間窗口的大小(以秒為單位),超過這個時間就會重置。 |
| key_type | string | 可選 | "var" | ["var", "var_combination", "constant"] | key 的類型。 |
| key | string | 可選 | "remote_addr" | -- | 用來做請求計數的依據,詳情參見key的使用小節。如果 key 的值為空,$remote_addr 會被作為默認 key。 |
| rejected_code | integer | 可選 | 503 | [200,...,599] | 當請求超過閾值被拒絕時,返回的HTTP 狀態碼。 |
| rejected_msg | string | 可選 | -- | 非空 | 當請求超過閾值被拒絕時,返回的響應體。 |
| allow_degradation | boolean | 可選 | false | -- | 當限流插件功能臨時不可用時(例如,Redis 超時)是否允許請求繼續。當值設置為 true 時則自動允許請求繼續,默認值是 false。 |
| show_limit_quota_header | boolean | 可選 | true | -- | 是否在響應頭中顯示X-RateLimit-Limit 和X-RateLimit-Remaining (限制的總請求數和剩余還可以發送的請求數),默認值是true。 |
| group | string | 可選 | -- | 非空 | 配置同樣的group 的 Route 將共享同樣的限流計數器。 |
| redis_host | string | 當policy為redis時必填 | -- | -- | 當使用redis 限速策略時,該屬性是 Redis 服務節點的地址。 |
| redis_port | integer | 可選 | 6379 | [1,...] | 當使用redis 限速策略時,該屬性是 Redis 服務節點的端口。 |
| redis_password | string | 可選 | -- | -- | 當使用redis 或者 redis-cluster 限速策略時,該屬性是 Redis 服務節點的密碼。 |
| redis_timeout | integer | 可選 | 1000 | [1,...] | 當使用redis 或者 redis-cluster 限速策略時,該屬性是 Redis 服務節點以毫秒為單位的超時時間。 |
| redis_cluster_nodes | array | 當policy 為 redis-cluster 時必填 | -- | -- | 當使用redis-cluster 限速策略時,該屬性是 Redis 集群服務節點的地址列表(至少需要兩個地址)。 |
| redis_cluster_name | string | 當policy 為 redis-cluster 時必填 | -- | -- | 當使用redis-cluster 限速策略時,該屬性是 Redis 集群服務節點的名稱。 |
count說明
- 當使用本地計數策略,即policy設置為local時,count數值為每個網關節點的限流計數。整個集群的限流計數=count 節點數;
- 當使用redis時,即policy設置為redis或redis-cluster時,count記錄在redis中,表示整個集群的全局限流計數。
key的使用說明
用來做請求計數的有效值。
key的類型
key的取值類型使用key_type標識,key_type支持三種值:"var", "var_combination", "constant"
- key_type為"constant"時,那么 key 會被當作常量。
- key_type為"var"時, key 會被當作變量名稱。
- key_type 為 "var_combination",那么 key 會當作變量組。比如如果設置 "remote_addr consumer_name" 作為 key,那么插件會同時受 remote_addr 和 consumer_name 兩個變量的約束。
例如,可以使用主機名(或服務器區域)作為關鍵字,以便限制每個主機名規定時間內的請求次數。我們也可以使用客戶端地址作為關鍵字,這樣我們就可以避免單個客戶端規定時間內多次的連接我們的服務。
當前接受的 key如下:
| key | key_type為var時填寫 | key_type為var_combination時填寫 |
|---|---|---|
| "remote_addr"(客戶端 IP 地址) | remote_addr | $remote_addr |
| "server_addr"(服務端 IP 地址) | server_addr | $server_addr |
| 請求頭中的值"X-Forwarded-For" | http_x_forwarded_For | $http_x_forwarded_For |
| 請求頭中的值"X-Real-IP" | http_x_real_ip | $http_x_real_ip |
| "consumer_name"(consumer 的 username) | consumer_name | $consumer_name |
| "service_id" | service_id | $service_id |
如何使用
在配置窗口頁以YAML格式填寫
配置示例
基于請求上下文和自定義表達式的限流配置示例。
通過將key_type設置為var或var_combination來支持基于請求上下文和自定義表達式的限流。支持各種請求參數和內置的nginx變量,以及變量組合。
常用參數示例:
remote_addr :客戶端ip
consumer_name:消費者名稱;其他nginx變量也支持
arg_name: url參數,name表示參數名稱
http_name: 請求header參數
cookie_name: 請求的cookie參數
下面是一個示例,開啟了limit count 插件,并設置key_type 為var,key設置為remote_addr表示基于客戶端ip進行請求限流:
count: 2
time_window: 60
rejected_code: 503
key_type: "var"
key: "remote_addr"
下面是一個示例,開啟了limit count 插件,并設置key_type 為var,key設置為arg_userId,可對不同的url參數userId分別進行限流計數:
"allow_degradation": false,
?"count": 20,
?"key": "arg_userId",
?"key_type": "var",
?"policy": "local",
?"rejected_code": 503,
?"show_limit_quota_header": true,
?"time_window": 30
下面是一個示例,開啟了limit count 插件,并設置key_type 為var_combination, key值設置為?consumer_name remote_addr,表示同時基于消費者名稱和客戶端ip進行限流計數。
count: 2
time_window: 60
rejected_code: 503
key_type: "var_combination"
key: "$consumer_name $remote_addr"
下面是一個示例,開啟了limit count 插件,并設置key_type 為constant:
基于常量的限流配置示例
通過設置key_type 為constant,key 的值將會直接作為常量來處理
count: 2
time_window: 60
rejected_code: 503
key_type: "constant"
key: "remote_addr"
全局限流配置示例
在頁面上選擇Redis單節點配置或者Redis集群配置,并設置redis相關參數即可開啟全局限流配置。
Redis可選擇通過平臺開通redis實例,或者自行部署,并在配置中填入連接信息即可。
配置示例:
# 時間窗口內的請求數量閾值
# [必填]特別地,當使用redis時,表示整個集群的請求計數。
count: 30
# [必填]時間窗口的大小(以秒為單位)
time_window: 60
# [可選]請求超過閾值被拒絕時,返回的 HTTP 狀態碼
rejected_code: 503
# [可選]key 的類型
key_type: "var"
# [可選]用來做請求計數的依據
key: "remote_addr"
# [可選]當設置rejected_msg時,非空。默認可不填
# rejected_msg: "Requests are too frequent, please try again later."
# [可選]當限流插件功能臨時不可用時(例如,Redis 超時)是否允許請求繼續。當值設置為 true 時則自動允許請求繼續,默認值是 false
allow_degradation: false
# [可選]是否在響應頭中顯示 X-RateLimit-Limit 和 X-RateLimit-Remaining (限制的總請求數和剩余還可以發送的請求數),默認值是 true
show_limit_quota_header: true
# [必填]速率限制策略,使用單節點redis
policy: "redis"
# [必填]redis服務地址
redis_host: "127.0.0.1"
# [可選]redis服務端口
redis_port: 6379
# [可選]redis服務密碼
redis_password: "password"
# [可選]redis服務的datebase
redis_database: 1
# [可選]redis服務的超時時間,單位毫秒
redis_timeout: 1000
停用/啟用
在配置頁面設置生效開關
驗證插件
上述配置限制了 60 秒內只能訪問 2 次,前兩次訪問都會正常訪問:
curl -i //127.0.0.1:9080/index.html
響應頭里面包含了X-RateLimit-Limit 和X-RateLimit-Remaining,他們的含義分別是限制的總請求數和剩余還可以發送的請求數:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 13175
Connection: keep-alive
X-RateLimit-Limit: 2
X-RateLimit-Remaining: 0
Server: APISIX web server
當你第三次訪問的時候,就會收到包含 503 返回碼的響應頭:
HTTP/1.1 503 Service Temporarily Unavailable
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Server: APISIX web server
503 Service Temporarily Unavailable
# 503 Service Temporarily Unavailable
---
openresty
同時,如果你設置了屬性rejected_msg 的值為"Requests are too frequent, please try again later." ,當你第三次訪問的時候,就會收到如下的響應體:
HTTP/1.1 503 Service Temporarily Unavailable
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Server: APISIX web server
{"error_msg":"Requests are too frequent, please try again later."}
這就表示limit count 插件生效了。
結果緩存proxy-cache插件
描述
proxy-cache?插件提供了緩存后端響應數據的能力,可以根據響應碼和請求模式等屬性來指定需要緩存的數據。
作用范圍
該插件目前只支持用于路由級插件。
屬性
| 名稱 | 類型 | 必選項 | 默認值 | 有效值 | 描述 |
|---|---|---|---|---|---|
| cache_key | array[string] | 可選 | ["$host", "$request_uri"] | 緩存key,可以使用變量。例如:["$host", "$request_uri"]。 | |
| cache_bypass | array[string] | 可選 | 當該屬性的值不為空或者非0時則會跳過緩存檢查,即不在緩存中查找數據,可以使用變量,例如:["$arg_bypass"]。 | ||
| cache_method | array[string] | 可選 | ["GET", "HEAD"] | ["GET", "POST", "HEAD"] | 根據請求method決定是否需要緩存。 |
| cache_http_status | array[integer] | 可選 | [200, 301, 404] | [200, 599] | 根據HTTP響應碼決定是否需要緩存。 |
| hide_cache_headers | boolean | 可選 | false | 當設置為true時將Expires和Cache-Control響應頭返回給客戶端。 | |
| cache_control | boolean | 可選 | false | 當設置為true時遵守HTTP協議規范中的Cache-Control的行為。 | |
| no_cache | array[string] | 可選 | 當此參數的值不為空或非0時將不會緩存數據,可以使用變量。 | ||
| cache_ttl | integer | 可選 | 300秒 | 當選項cache_control未開啟或開啟以后服務端沒有返回緩存控制頭時,提供的默認緩存時間。 |
如何啟用
在配置窗口頁以YAML 格式填寫
配置示例
下面是一個示例,開啟proxy-cache 插件,并配置了一些屬性。表示對于路徑為“/hello”的路由,在60秒內,對于返回結果為200的GET請求將返回緩存結果,其中緩存的key為請求uri+"-cache-id"的拼接字符串。
curl //127.0.0.1:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"proxy-cache": {
"cache_key": ["$uri", "-cache-id"],
"cache_bypass": ["$arg_bypass"],
"cache_method": ["GET"],
"cache_http_status": [200],
"hide_cache_headers": true,
"cache_control": false,
"cache_ttl": 60
}
},
"upstream": {
"nodes": {
"127.0.0.1:1999": 1
},
"type": "roundrobin"
},
"uri": "/hello"
}'
啟用/停用
在路由上綁定/解綁插件
驗證插件
在路由上綁定結果緩存插件后,第一次請求Apisix-Cache-Status狀態為MISS
$curl -i 127.0.0.1:27151/api/1/reviews
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Apisix-Cache-Status: MISS
Date: Mon, 18 Mar 2024 12:02:07 GMT
Server: APISIX/2.13.3
[{"id":1,"productId":1,"reviewer":"Reviewer1","text":"This is the 1st reviewer"}]
再次請求,命中緩存,Apisix-Cache-Status狀態為HIT
$ curl -i 127.0.0.1:27151/api/1/reviews
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Date: Mon, 18 Mar 2024 12:02:07 GMT
Server: APISIX/2.13.3
Age: 3
Apisix-Cache-Status: HIT
[{"id":1,"productId":1,"reviewer":"Reviewer1","text":"This is the 1st reviewer"}]
安全限制類
跨域CORS插件
描述
cors 是一個跨域訪問插件。
作用范圍
該插件即可用于全局插件,也可用于路由級插件。全局插件配置的優先級高于路由級插件配置,當同時在某一路由上配置了cores的全局插件和路由級插件時,以全局插件配置中設置的屬性值為準。
屬性
| 名稱 | 類型 | 必選項 | 默認值 | 描述 |
|---|---|---|---|---|
| allow_origins | string | 可選 | "*" | 允許跨域訪問的來源,作用于Access-Control-Allow-Origin 頭部,格式如:scheme://host:port,比如://ctyun.com:8081。多個值時使用","分割,不允許攜帶憑證時可以使用"*"來表示所有Origin均允許通過。 |
| allow_methods | string | 可選 | "*" | 允許跨域訪問的方法,作用于Access-Control-Allow-Methods 頭部。多個值時使用","分割,支持“GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH”等方法。不允許攜帶憑證時可以使用"*"來表示所有 Method 均允許通過。 |
| allow_headers | string | 可選 | "*" | 允許跨域訪問時請求方攜帶哪些非CROS 規范以外的 Header,多個值時使用","分割,不允許攜帶憑證時可以使用"*"來表示所有 Header 均允許通過。 |
| expose_headers | string | 可選 | "*" | 允許跨域訪問時響應方攜帶哪些非CROS 規范以外的 Header,多個值時使用","分割,不允許攜帶憑證時可以使用"*"來表示所有 Header 均允許通過。 |
| max_age | integer | 可選 | 5 | 瀏覽器緩存CORS 結果的最大時間,單位為秒,在這個時間范圍內瀏覽器會復用上一次的檢查結果,-1 表示不緩存。作用于 Access-Control-Max-Age 頭部。 |
| allow_credential | boolean | 可選 | false | 是否允許攜帶憑證,作用于Access-Control-Allow-Credentials 頭部。 |
如何啟用
在配置窗口頁以 YAML 格式填寫
配置示例
在服務對象中配置cors插件,此處設置緩存結果的最大時間max_age=600。
curl //192.168.0.95:27152/apisix/admin/routes/1 -H 'X-API-KEY: 2571e288e8f4cd273cab342440068469' -X PUT -d '> {
> "name": "test12",
> "uri": "/hello",
> "plugins": {
> "cors": {
> "max_age": 600
> }
> },
> "upstream": {
> "type": "roundrobin",
> "nodes": {
> "127.0.0.1:39087": 1
> }
> }
> }'
啟用/停用
在配置頁面設置生效開關
驗證插件
請求接口,發現已返回cors相關的 header,代表插件已經生效。
curl -v //192.168.0.95:27151/hello -X GET
...
< Server: APISIX/2.13.3
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: *
< Access-Control-Max-Age: 600
< Access-Control-Expose-Headers: *
< Access-Control-Allow-Headers: *
...
信息重寫類
重寫Proxy-rewrite插件
描述
proxy-rewrite 是一個上游服務信息重寫插件。
作用范圍
該插件即可用于全局插件,也可用于路由級插件。全局插件配置的優先級高于路由級插件配置,當同時在某一路由上配置了proxy-rewrite的全局插件和路由級插件時,以全局插件配置中設置的屬性值為準。
屬性
| 名稱 | 類型 | 必選項 | 有效值 | 描述 |
|---|---|---|---|---|
| uri | string | 否 | -- | 轉發到上游的新uri 地址。 |
| regex_uri | array[string] | 否 | ["GET", "POST", "PUT", "HEAD", "DELETE", "OPTIONS","MKCOL", "COPY", "MOVE", "PROPFIND", "PROPFIND","LOCK", "UNLOCK", "PATCH", "TRACE"] | 轉發到上游的新uri 地址, 使用正則表達式匹配來自客戶端的 uri,當匹配成功后使用模板替換轉發到上游的 uri, 未匹配成功時將客戶端請求的 uri 轉發至上游。當 uri 和 regex_uri 同時存在時,uri 優先被使用。 |
| host | string | 否 | -- | 轉發到上游的新host 地址。 |
如何使用
在配置窗口頁以 YAML 格式填寫
配置示例
下面是一個示例,在指定的 API 上開啟了proxy-rewrite 插件。
curl //192.168.0.95:27152/apisix/admin/routes/1 -H 'X-API-KEY: 2571e288e8f4cd273cab342440068469' -X PUT -d '
{
"methods": ["GET"],
"uri": "/test/index.html",
"plugins": {
"proxy-rewrite": {
"uri": "/test/home.html",
"scheme": "http",
"host": "ctyun.com",
"headers": {
"X-Api-Version": "v1",
"X-Api-Engine": "apisix",
"X-Api-useless": ""
}
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:80": 1
}
}
}'
啟用/停用
在配置頁面設置生效開關
驗證插件
發送請求,查看上游服務的 access.log,如果輸出信息與配置一致:
curl -X GET //192.168.0.95:27152/test/index.html
127.0.0.1 - [2/Aug/2023:10:52:20 +0800] ctyun.com GET /test/home.html HTTP/1.1 200 38 - curl/7.29.0 - 0.000 199 107
這就表示proxy-rewrite 插件已經生效了。
重寫proxy-cookie插件
描述
proxy-cookie插件是對響應頭部set-cookie字段中的path屬性或者domain屬性進行重寫,校驗的對象:
- 請求目標服務的返回頭部Set-Cookie中Path屬性。
- 請求目標服務的返回頭部Set-Cookie中Domain屬性。

注意set-cookie頭部不區分大小寫
作用范圍
該插件只能用于路由級插件,因為每條路由響應頭部set-cookie字段中的path屬性或者domain屬性不同,要視具體情況而定。
屬性
| 名稱 | 類型 | 必選項 | 默認值 | 有效值 | 描述 |
|---|---|---|---|---|---|
| domain | Object | 可選 | -- | -- | domain域的重寫配置 |
| domain | use | boolen | 可選 | false | [false, true] |
| domain | regex | string | -- | -- | -- |
| domain | replacement | string | -- | -- | -- |
| path | Object | 可選 | -- | -- | path域的重寫配置 |
| path | use | boolen | 可選 | false | [false, true] |
| path | regex | string | -- | -- | -- |
| path | replacement | string | -- | -- | -- |
如何啟用
在配置窗口頁以 YAML 格式填寫。
配置示例
- 樣例
配置proxy-cookie插件內容,關閉domain,開啟path。
curl //192.168.0.95:27152/apisix/admin/routes/1 -H 'X-API-KEY: 2571e288e8f4cd273cab342440068469' -X PUT -d '
{
"name": "test",
"uri": "/hello",
"plugins": {
"proxy-cookie": {
"domain": {
"use": false
},
"path": {
"regex": "/c/app",
"use": true,
"replacement": "/"
},
"disable": true
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:39087": 1
}
}
}'
- 示例場景
以Path屬性為例,Domain屬性同理。
- 測試場景1:當set-cookie中不存在Path屬性時
用例1-1:屬性關閉
即 proxy_cookie_path = {use=false}, 表示不對Path屬性進行重寫
用例1-2:屬性開啟
proxy_cookie_path = {use=true, regex="/app/a/b", replacement="/a/b"}, 表示不對Path屬性進行重寫
proxy_cookie_path = {use=true, regex="^/app/a/b", replacement="/a/b"}, 表示不對Path屬性進行重寫
- 測試場景2:當set-cookie中存在Path屬性時
如set-cookie: Path=/c/app/a/b
用例2-1 屬性關閉
即 proxy_cookie_path = {use=false}, 表示不對Path屬性進行重寫
用例2-2 屬性開啟
proxy_cookie_path = {use=true, regex="/app/a/b", replacement="/a/b"},表示對Path屬性進行重寫,重寫后,set-cookie: Path=/c/a/b
proxy_cookie_path = {use=true, regex="*/a/b", replacement="/a/b"}, 表示對Path屬性進行重寫,重寫后,set-cookie: Path=/a/b
proxy_cookie_path = {use=true, regex="c/a/b", replacement="/a/b"}, 表示對Path屬性進行重寫,重寫后(未匹配時,原樣輸出),set-cookie: Path=/c/app/a/b
啟用/啟停
在配置頁面設置生效開關。
驗證插件
假定請求響應中的Set-cookie字段信息如下

配置示例如樣例中設置,對應的yaml如下
# 對應proxy_cookie_domain
domain:
# 是否更改domain屬性,默認為false, 當設置為true時匹配規則和替換值不可為空
use: false
# 匹配規則
#regex: "ctyun.com"
# 替換值
#replacement: ""
# 對應proxy_cookie_path
path:
# 是否更改path屬性,默認為false, 當設置為true時匹配規則和替換值不可為空
use: true
# 匹配規則
regex: "/c/app"
# 替換值
replacement: "/"
請求接口,發現在header的Set-cookie字段中帶上了Path與Domain的值,代表插件已經生效。

頭部重寫header-rewrite插件
描述
header-rewrite插件可以對請求/響應頭部的header參數進行新增、修改和刪除操作。
作用范圍
該插件只能用于路由級插件,因為每條路由請求/響應頭部的header參數不同,要視具體情況而定。
屬性
| 名稱 | 類型 | 必選項 | 默認值 | 有效值 | 描述 |
|---|---|---|---|---|---|
| request | Object | 可選 | -- | -- | 修改請求header,支持新增、修改、刪除操作。 |
| request | add | Array | -- | -- | -- |
| request | update | Array | -- | -- | -- |
| request | delete | Array | -- | -- | -- |
| response | Object | 可選 | -- | -- | 修改響應header,支持新增、修改、刪除操作。 |
| response | add | Array | -- | -- | -- |
| response | update | Array | -- | -- | -- |
| response | delete | Array | -- | -- | -- |
支持的類型:
● request:請求頭部類型
● response:響應頭部類型
允許的操作:
● 新增:增加一個頭部
● 修改:存在則更新;不存在則增加
● 刪除:去掉一個指定key,不需要指定value
如何使用
在配置窗口頁以 YAML 格式填寫
配置示例
模板參考:
# 修改請求header,支持新增、修改、刪除操作,操作類型不為空時,其目標header key也不能為空
request:
# 新增操作,當存在目標header key時,末尾追加值;否則,新增一個header
add:
num: 123
name: "cgw"
# 更新操作,當存在目標header key時,更新header值;否則,新增一個header
update:
num: 234
name: "CGW"
# 刪除操作,當存在目標header key時,刪除目標header;否則忽略
delete:
- id
- name
# 修改響應header,支持新增、修改、刪除操作,操作類型不為空時,其目標header key也不能為空
response:
# 新增操作,當存在目標header key時,末尾追加值;否則,新增一個header
add:
num: 123
name: "cgw"
# 更新操作,當存在目標header key時,更新header值;否則,新增一個header
update:
num: 234
name: "CGW"
# 刪除操作,當存在目標header key時,刪除目標header;否則忽略
delete:
- id
- name
啟用/停用
在配置頁面設置生效開關。
驗證插件
請求接口,若發現已返回header發生變更,代表插件已經生效。