问题背景:
前端需要发送一个这样的请求,但出现404
首先解析请求的变化:
http://www.51xuecheng.cn/api/checkcode/pic
1.请求先打在nginx,www.51xuecheng.cn/api/checkcode/pic部分匹配到了之后会转发给网关进行处理变成localhost:63010/checkcode/pic
2.然后再转发到网关上,网关上的路由转发配置如下图。然后localhost:63010/checkcode/pic来到网关之后,发现符合/checkcode开头的请求,因此就转发拼接给uri中的去处理(此处为lb://checkcode。因此就变成localhost:63075/pic
但我们是需要localhost:63075/checkcode/pic才能把请求发送到对应服务。因此就要进行路由重写
这样的请求是能成功的
官网案例:
- RewritePath=/red(?<segment>/?.*), $\{segment}
spring:
cloud:
gateway:
routes:
- id: rewritepath_route
uri: https://example.org
predicates:
- Path=/red/**
filters:
- RewritePath=/red(?<segment>/?.*), $\{segment}
正则表达式解析:
命名分组:(?<segment>/?.*)
这一部分是将后面匹配的字符串捕获到一个名为segment的组中,如这个案例中就是将/?.*这部分自定义的捕获到segment中
- ?<segment>
名称为 segment 的组
- /?
字符/出现0次或1次
- .*
任意字符出现0次或多次
引用捕获文本:$\{segment}
将前面名为 segment 的组捕获到的字符串移动到此。
注意:此处\的出现是避免 yaml 认为这是一个变量${segment}
实例:
此处的路由意思就是去掉/checkcode/,并捕获后面的字符串,然后用/xxxx代替去掉的部分,再拼接捕获的部分。
如localhost:63075/checkcode/pic --> localhost:63075/xxxx/pic
- id: checkcode
uri: lb://checkcode
predicates:
- Path=/checkcode/**
filters:
- RewritePath=/checkcode/?(?<segment>.*), /xxxx/$\{segment}
补充:
注意注意!!!
若配置路由URI为lb,则注册中心服务名称不能和server.servlet.context-path名称一致,否则contextPath会被改写为空字符串
在这我就是犯了这个错,导致路由重写也没有办法解决
文章来源:https://www.toymoban.com/news/detail-736737.html
文章来源地址https://www.toymoban.com/news/detail-736737.html
到了这里,关于简单明了!网关Gateway路由配置filters实现路径重写及对应正则表达式的解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!