Spring Cloud Gateway YAML配置中如何用正则实现Path路径OR匹配
结论:直接写
/(api1|api2|api3)/test/**的写法无法生效 Spring Cloud Gateway 内置的 Path 谓词底层默认采用 Ant 风格路径匹配规则,不会将路径字符串里的括号、竖线识别为正则语法。你写的上述正则形式会被当作普通的路径字符串进行匹配,最终无法命中任何目标请求路径。
符合要求的无代码、无重写的实现方案
你不需要编写自定义代码、也不需要配置路径重写规则,只需要利用 Path 谓词原生支持的路径段正则占位语法,就可以实现正则形式的多路径OR匹配。具体规则为:路径段内使用{自定义变量名:正则表达式}的格式标记需要做正则匹配的片段,谓词会自动将冒号后的正则应用到对应路径段的校验逻辑上。
正确的YAML配置示例
spring: cloud: gateway: routes: - id: test-service uri: http://localhost:8080/ predicates: - Path=/{apiName:api1|api2|api3}/test/**
方案效果说明
- 匹配范围和你之前逗号分隔配置三个路径的效果完全一致,可以正常命中
/api1/test/**、/api2/test/**、/api3/test/**三类请求路径 - 不会对原始请求路径做任何截断、重写操作,转发到下游服务的路径和原始请求路径完全一致
- 不需要引入额外依赖、不需要编写自定义Predicate工厂代码,属于Path谓词的原生兼容能力,Spring Cloud Gateway 2.x以上全版本都可直接使用
常见踩坑提醒
- 正则匹配段必须用大括号包裹,不能直接将正则分组写在路径段上,否则会被Ant匹配逻辑识别为普通字符,导致匹配失效
- 正则表达式仅作用于对应的单个路径段,不会跨路径段做匹配,如果需要跨段的正则匹配,不需要更换谓词,只需要在对应路径段分别添加独立的正则占位即可
- 该写法不会对路由参数传递造成影响,占位的变量名只是用来标记正则匹配段,不需要配合后续的路径重写规则使用
内容的提问来源于stack exchange,提问作者manish
相关产品推荐
相关产品推荐

