You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Spring Boot网关配置URL末尾斜杠重定向时出现重定向循环问题求助

Spring Boot网关配置URL末尾斜杠重定向时出现重定向循环问题求助

嘿,我来帮你排查这个重定向循环的问题!

首先得指出你当前配置里的核心问题:你第一个路由的RedirectTo过滤器写死了重定向目标为/api/user,这完全不符合你“把/api/user/home/重定向到/api/user/home”的需求——所有匹配/api/user/**/的请求(比如你测试的/api/user/home/)都会被强制跳转到固定的/api/user,而不是去掉末尾斜杠的原路径。这种硬编码的目标路径很容易触发循环,比如如果/api/user本身被访问时带斜杠,就会反复触发重定向规则,导致报错Exceeded maxRedirects

下面给你两个可行的解决方案,按需选择:

方案一:动态路径匹配实现精准重定向

修改第一个路由的配置,通过路径变量动态捕获需要保留的路径部分,再重定向到去掉末尾斜杠的目标路径:

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: remove-trailing-slash
          uri: no://op
          predicates:
            - Path=/api/user/{path:.*}/  # 匹配/api/user开头且末尾带斜杠的路径,捕获中间的路径片段
          filters:
            - RedirectTo=301,/api/user/{path}  # 重定向到去掉末尾斜杠的对应路径
        - id: user-service
          uri: http://localhost:8081
          predicates:
            - Path=/api/user/**
          filters:
            - StripPrefix=1
server:
  port: 8084

这样当你访问/api/user/home/时,路由会捕获到path变量为home,自动重定向到/api/user/home,这个路径会被第二个路由匹配并转发到用户服务,完全不会有循环问题。

方案二:启用内置过滤器(更省心推荐)

Spring Cloud Gateway本身就自带了移除末尾斜杠的全局过滤器,不需要自己手动写路由规则,直接启用即可处理所有路径的末尾斜杠问题:

spring:
  application:
    name: gateway
  cloud:
    gateway:
      default-filters:
        - RemoveTrailingSlash=true  # 全局启用自动移除末尾斜杠的过滤器
      routes:
        - id: user-service
          uri: http://localhost:8081
          predicates:
            - Path=/api/user/**
          filters:
            - StripPrefix=1
server:
  port: 8084

这个配置会自动将所有带末尾斜杠的请求(比如/api/user/home//api/user/)重定向到不带斜杠的对应路径,内置过滤器已经处理好了路径匹配的逻辑,彻底避免手动配置出错导致的循环问题。

最后再提醒下:之前的循环本质是硬编码重定向目标导致的,用动态匹配或者内置过滤器都能完美解决你的需求,后者更适合全局统一处理的场景,推荐优先尝试~

火山引擎 最新活动