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/)重定向到不带斜杠的对应路径,内置过滤器已经处理好了路径匹配的逻辑,彻底避免手动配置出错导致的循环问题。
最后再提醒下:之前的循环本质是硬编码重定向目标导致的,用动态匹配或者内置过滤器都能完美解决你的需求,后者更适合全局统一处理的场景,推荐优先尝试~




