简单明了!网关Gateway路由配置filters实现路径重写及对应正则表达式的解析

问题背景:

前端需要发送一个这样的请求,但出现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}
相关推荐
❀͜͡傀儡师4 分钟前
docker一键部署网页版Win11系统
运维·docker·容器
Hello.Reader16 分钟前
Flink Process Table Functions(PTF)实战详解:把 SQL 变成“可编程算子”,状态、时间、定时器一把梭
网络·sql·flink
2301_8000509925 分钟前
华为云介绍
运维·华为云
萌萌哒草头将军1 小时前
AudioDock:服务器和 NAS 音频播放最棒的软件!🚀🚀🚀
服务器·docker·node.js
lifewange1 小时前
测试场景 Linux 命令速查表
linux·运维·服务器
就叫飞六吧2 小时前
JSONPath“隔空取物”思想,直击JSON深处的目标字段
服务器·windows·json
姚青&2 小时前
Linux 命令介绍以及帮助命令介绍
linux·运维·服务器
遇见火星2 小时前
详解 Linux 中的 /etc/fstab 文件
linux·运维·服务器
menggb072 小时前
在Linux系统上安装和使用Prometheus+Grafana
linux·运维·prometheus
2301_773730312 小时前
网络编程—TCP传输控制协议
服务器·网络·tcp/ip