Skip to content

RewritePath GatewayFilter 工厂

RewritePath GatewayFilter 工厂接受一个路径 regexp(正则表达式)参数和一个 replacement(替换)参数。 它使用 Java 正则表达式提供了一种灵活的方式来重写请求路径。

以下示例配置了一个 RewritePath GatewayFilter:

application.yml

yaml
spring:
  cloud:
    gateway:
      routes:
      - id: rewritepath_route
        uri: https://example.org
        predicates:
        - Path=/red/**
        filters:
        - RewritePath=/red/?(?<segment>.*), /$\{segment}

作用: 对于路径为 /red/blue 的请求,此配置会在发起下游请求之前将路径设置为 /blue

注意:YAML 转义

请注意,由于 YAML 规范的原因,$ 应该被替换为 $\(在上述示例中,为了正确表示 ${segment} 变量的引用,写作了 /$\{segment})。

补充教学 —— 为什么要重写路径?

场景 1:去除 API 上下文前缀(最常用)

  • 前端请求:前端为了方便管理,给所有请求加了前缀 /api,比如 GET /api/users/1
  • 后端服务:后端微服务的接口定义并没有 /api,只有 /users/1
  • 解决:使用 RewritePath/api 去掉。
    • 配置:RewritePath=/api/?(?<segment>.*), /$\{segment}
    • 效果:/api/users/1 -> /users/1

场景 2:版本兼容

  • 前端请求GET /v1/service/hello
  • 后端重构:后端新版服务接口变了,需要映射到 /v2/new-service/hello
  • 解决:使用正则重写。
    • 配置:RewritePath=/v1/service/?(?<segment>.*), /v2/new-service/$\{segment}

原理主要靠正则捕获组

  • (?<segment>.*) 是一个命名捕获组,名字叫 segment。它匹配 /red/ 后面的所有内容。
  • /$\{segment} 是替换目标。它引用了刚才捕获的内容。
  • 所以 /red/blue 匹配后,segment 捕获到了 blue,最终替换结果就是 /blue

Based on Spring Framework.