简单明了!网关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}
相关推荐
bbsh209942 分钟前
SiteAzure:SetCookie 未设置Secure
前端·网络·安全·siteazure
GalaxyPokemon1 小时前
LeetCode - 76. 最小覆盖子串
运维·服务器·数据结构·算法·leetcode
楽码1 小时前
安装和编写grpc协议文件
服务器·后端·grpc
wearegogog1232 小时前
Docker Buildx 简介与安装指南
运维·docker·容器
西北大程序猿2 小时前
服务器代码知识点补充
服务器·开发语言·网络·c++·网络协议
打不了嗝 ᥬ᭄3 小时前
进程控制
linux·运维·服务器·c++
苏州向日葵4 小时前
virtualBox安装ubuntu,常用知识点
linux·运维·ubuntu
夜光小兔纸4 小时前
SQL Server 修改数据库名及物理数据文件名
运维·数据库·sql server
yangzx的网工日常4 小时前
网络的那些事——初级——OSPF(2)
网络
Gnevergiveup4 小时前
路由交换技术-思科拓扑搭建
服务器·vpn·思科·vlan划分·拓扑搭建