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
}
}
}'
配置解析
"vars": [
["uri", "~~", "^/[a-z]+$"]
]
各部分含义:
uri
:
- 这是要匹配的变量名称。在这个例子中,表示我们要检查请求的 URI。
~~
:
- 这是一个匹配操作符,用于表示正则表达式匹配。在 APISIX 中,
~~
表示“使用正则表达式进行匹配”。
- 这是一个匹配操作符,用于表示正则表达式匹配。在 APISIX 中,
"^/[a-z]+$"
:
- 这是一个正则表达式,表示 URI 必须以
/
开头,后面跟着一个或多个小写字母(
[a-z]
),并且整个字符串必须以这些小写字母结束。 - 具体来说:
^
:表示字符串的开始。/
:表示 URI 必须以斜杠开头。[a-z]+
:表示后面至少有一个小写字母。$
:表示字符串的结束。
- 这是一个正则表达式,表示 URI 必须以
示例匹配
匹配的 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这种限流,应该如何实现?
实现思路
- 路由a和路由b它们的前缀匹配是相同的
- 路由b通过vars添加路由规则,找出要限制的uri
- 路由a添加相同的vars,但需要添加
!非
运算符,这样a和b就分别处理不同的uri了,但前缀是相同的
路由配置
# 路由a
"uri": "/demo/*",
"vars": [
[
"uri",
"!",
"~*",
"^.*/search$"
]
],
# 路由b
"uri": "/demo/*",
"vars": [
[
"uri",
"~*",
"^.*/search$"
]
],
apisix-dashboard中的体现