简单明了!网关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}
相关推荐
Karoku0662 小时前
【CI/CD】CI/CD环境搭建流程和持续集成环境配置
运维·ci/cd·docker·容器·kubernetes·prometheus
阿里云云原生2 小时前
山石网科×阿里云通义灵码,开启研发“AI智造”新时代
网络·人工智能·阿里云·ai程序员·ai程序员体验官
勤奋的凯尔森同学5 小时前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin
丁卯4045 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
chengooooooo5 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
人间打气筒(Ada)7 小时前
MySQL主从架构
服务器·数据库·mysql
落笔画忧愁e8 小时前
FastGPT快速将消息发送至飞书
服务器·数据库·飞书
小冷爱学习!8 小时前
华为动态路由-OSPF-完全末梢区域
服务器·网络·华为
技术小齐9 小时前
网络运维学习笔记 016网工初级(HCIA-Datacom与CCNA-EI)PPP点对点协议和PPPoE以太网上的点对点协议(此处只讲华为)
运维·网络·学习
ITPUB-微风9 小时前
Service Mesh在爱奇艺的落地实践:架构、运维与扩展
运维·架构·service_mesh