背景需求:需要通过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

注: 这里注意几点:

  1. 正则只能配置一个url,如果配置多个会不生效,故这里分开配置,略显繁琐。
  2. name名称一定要不一样,不然也会出现配置不生效,如果有name相同名字的只有第一个生效。
  3. 如果相同域名的还有其他地方配置的/,那么这里正则的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不能相同。