如何为Istio URI正则表达式模式设置否定条件
Istio虚拟服务配置:仅转发非v2的/guest流量
你的问题出在原正则的匹配逻辑上:\w*只能匹配字母、数字和下划线,没法覆盖/guest/address/list这类带多级/的路径,而且限制了guest/后的字符类型,导致多级路径无法被命中。下面给两种可行的解决方法:
方案一:用not规则排除v2流量(推荐,更直观易维护)
Istio支持在匹配条件里用not直接排除特定前缀的流量,同时补充精确匹配覆盖单独的路径:
http: # 匹配所有非/guest/v2开头的/guest相关请求 - match: # 匹配/guest/开头但不是/guest/v2/开头的流量 - uri: prefix: "/guest/" not: uri: prefix: "/guest/v2/" # 单独匹配/guest、/guest/profile、/guest/address这些精确路径 - uri: exact: "/guest" - uri: exact: "/guest/profile" - uri: exact: "/guest/address" route: - destination: port: number: 8080 host: my-guest.svc # 给v2流量返回403拒绝 - match: - uri: prefix: "/guest/v2/" - uri: exact: "/guest/v2" fault: abort: httpStatus: 403 percentage: value: 100.0
方案二:修正正则表达式
如果一定要用正则,调整为匹配所有不以/guest/v2开头的/guest路径,同时支持多级子路径:
http: - match: - uri: regex: "^/guest(?!/v2)(/.*)?$" route: - destination: port: number: 8080 host: my-guest.svc # 拒绝v2流量 - match: - uri: regex: "^/guest/v2(/.*)?$" fault: abort: httpStatus: 403 percentage: value: 100.0
正则解释
^/guest(?!/v2)(/.*)?$:
^/guest:锁定以/guest开头的路径(?!/v2):否定前瞻,确保/guest后面不会紧跟着/v2(/.*)?:可选的后续路径段(包括多级/),问号允许路径到/guest就结束(匹配/guest本身)
内容的提问来源于stack exchange,提问作者Karthik Cherukuri
相关产品推荐
相关产品推荐

