apisix~路由字首的正則匹配

张占岭發表於2024-12-03

參考:https://apisix.apache.org/zh/docs/apisix/FAQ/

在你提供的 Apache APISIX 路由配置中,vars 欄位用於定義一些變數匹配規則。具體來說,vars 欄位可以用來根據請求的特定變數(如 URI、請求方法等)進行條件匹配。

新增正則路由

curl -i http://127.0.0.1:9180/apisix/admin/routes/1 -H "X-API-KEY: $admin_key" -X PUT -d '
{
    "uri": "/*",
    "vars": [
        ["uri", "~~", "^/[a-z]+$"]
    ],
    "upstream": {
            "type": "roundrobin",
            "nodes": {
                "127.0.0.1:1980": 1
            }
    }
}'

配置解析

"vars": [
    ["uri", "~~", "^/[a-z]+$"]
]

各部分含義:

  1. uri:

    • 這是要匹配的變數名稱。在這個例子中,表示我們要檢查請求的 URI。
  2. ~~:

    • 這是一個匹配運算子,用於表示正規表示式匹配。在 APISIX 中,~~ 表示“使用正規表示式進行匹配”。
  3. "^/[a-z]+$":

    • 這是一個正規表示式,表示 URI 必須以 / 開頭,後面跟著一個或多個小寫字母([a-z]),並且整個字串必須以這些小寫字母結束。
    • 具體來說:
      • ^:表示字串的開始。
      • /:表示 URI 必須以斜槓開頭。
      • [a-z]+:表示後面至少有一個小寫字母。
      • $:表示字串的結束。

示例匹配

  • 匹配的 URI

    • /abc
    • /xyz
    • /a
  • 不匹配的 URI

    • /ABC(包含大寫字母)
    • /123(包含數字)
    • /abc/def(包含多個路徑段)

以/search結尾的路由正則

 "uri": "/kc/*",
  "vars": [
    "uri",
    "~~",
    "^.*/userinfo$"
  ]

總結

透過這種方式,vars 欄位允許你對請求的 URI 進行更細粒度的控制和過濾。只有當請求的 URI 符合指定的正規表示式時,路由才會被匹配到。這使得路由配置更加靈活,可以針對特定的請求進行處理。

實踐

  • 如果兩個路由a和b,其中a是正常的請求,b用來限制某個規則的uri需要新增limit-count這種限流,應該如何實現?

實現思路

  1. 路由a和路由b它們的字首匹配是相同的
  2. 路由b透過vars新增路由規則,找出要限制的uri
  3. 路由a新增相同的vars,但需要新增!非運算子,這樣a和b就分別處理不同的uri了,但字首是相同的

路由配置

 # 路由a
 "uri": "/demo/*",
  "vars": [
    [
      "uri",
      "!",
      "~*",
      "^.*/search$"
    ]
  ],
# 路由b
 "uri": "/demo/*",
  "vars": [
    [
      "uri",
      "~*",
      "^.*/search$"
    ]
  ],

apisix-dashboard中的體現

相關文章