Skip to content

SetPath GatewayFilter 工厂

SetPath GatewayFilter 工厂接受一个路径 template 参数。 它通过允许路径的模板化片段,提供了一种操作请求路径的简单方法。 这使用了 Spring Framework 的 URI 模板。 允许多个匹配片段。

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

application.yml

yaml
spring:
  cloud:
    gateway:
      routes:
      - id: setpath_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment}
        filters:
        - SetPath=/{segment}

对于路径为 /red/blue 的请求,这会在发起下游请求之前将路径设置为 /blue

补充教学 —— SetPath 与 RewritePath 的区别?

很多同学容易搞混 SetPathRewritePath,其实它们解决的是同一个问题(修改请求路径),但手段不同

  • RewritePath (正则替换派)

    • 原理:基于正则表达式。把路径看作一个字符串,匹配你给的正则,然后替换成新的字符串。
    • 配置RewritePath=/red/(?<segment>.*), /$\{segment}
    • 优点:正则功能强大,适合复杂的字符串处理。
    • 缺点:正则写起来容易头晕,不仅要转义,还要小心匹配范围。
  • SetPath (模板提取派)

    • 原理:基于 URI 模板变量。它通常和 Path 断言配合使用。
    • 流程
      1. 提取Path=/red/{segment} 先把 /red/blue 中的 blue 提取出来,存到变量 segment 里。
      2. 设置SetPath=/{segment} 直接拿 segment 变量的值(blue)拼成新路径 /blue
    • 优点简单、直观。只要 Path 断言里抓到了变量,这里直接用就行,不用写复杂的正则。
    • 生活类比
      • RewritePath 像是做整形手术,动刀子把原来的样子改成新的。
      • SetPath 像是搭积木,把原来的积木块(变量)拆下来,重新拼成一个新的形状。

最佳实践: 如果你的路径修改逻辑比较简单(比如去掉前缀、重新排列路径段),优先使用 SetPath + Path 断言,可读性更高。

Based on Spring Framework.