背景需求:需要通过apisix做token认证,然后针对一部分的url不做认证,有的url是/xxx/*/xxx,这样格式的,这里我是通过apisix组件ingress controller设置apisixroute配置的路由,如果直接通过apisix admin的话直接就可以添加,而通过controller会出现问题,下面是报错信息:
The ApisixRoute "e-installment-service" is invalid: spec.http[2].match.paths[0]: Invalid value: ".*call": spec.http[2].match.paths[0] in body should match '^/[a-zA-Z0-9\-._~%!$&'()+,;=:@/]*\*?$'
后来查阅资料文档发现,controller不支持这样**这样的配置,如果想这样配置只能通过正则的方式,原文链接:https://navendu.me/posts/batching-requests/#configure-routes
上述原文链接,本文有不明确的地方可参考原文。
知道原因后下面就是配置,其实配置不难需要注意细节。配置如下
# 白名单
- name: e-installment-service-white
match:
hosts:
- xx.test.com
paths:
- /outer-partner/e-installment*
exprs:
- subject:
scope: Path
name: callback
op: RegexMatch
value: "^/outer-partner/e-installment/[^/]*/contract/callback$"
backends:
- serviceName: e-installment-service
servicePort: 9088
- name: e-installment-service-white1
match:
hosts:
- xx.test.com
paths:
- /outer-partner/e-installment*
exprs:
- subject:
scope: Path
name: callback
op: RegexMatch
value: "^/outer-partner/e-installment/[^/]*/callback$"
backends:
- serviceName: e-installment-service
servicePort: 9088
- name: e-installment-service-white3
match:
hosts:
- xx.test.com
paths:
- /outer-partner/e-installment*
exprs:
- subject:
scope: Path
name: callback
op: RegexMatch
value: "^/outer-partner/e-installment/[^/]*/video/report$"
backends:
- serviceName: e-installment-service
servicePort: 9088
- name: e-installment-service-white4
match:
hosts:
- xx.test.com
paths:
- /eSign/signUrl/*
backends:
- serviceName: e-installment-service
servicePort: 9088
注: 这里注意几点:
- 正则只能配置一个url,如果配置多个会不生效,故这里分开配置,略显繁琐。
- name名称一定要不一样,不然也会出现配置不生效,如果有name相同名字的只有第一个生效。
- 如果相同域名的还有其他地方配置的/,那么这里正则的paths值,最好长一点,比如xxx.cdd.com,有接口/test/info/dsfsfdfsdf/a、/test/info/aaaaaa/a、/test1/info,这里test/info后面的串比如是随机生成的,然后我希望配置到/test/info/*/a的代理的A服务,/test1/info代理到B服务,那么默认可能会有/*配置到B服务上,这时候上述正则的paths最好配置成/test/info/*,这样正则匹配就不会有问题了,而且要分开两个配置且name不能相同。