apisix~路由前缀的正则匹配

参考: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
            }
    }
}'

配置解析

json 复制代码
"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中的体现