Spring Cloud Gateway:如何重定向到其他主机并保留请求路径
解决Spring Cloud Gateway Redirect过滤器丢失请求路径的问题
你当前的问题在于redirect过滤器的目标URL是固定根地址,没有保留原请求的路径部分。Spring Cloud Gateway的redirect过滤器支持内置占位符来动态拼接请求路径,具体解决方法如下:
修改Redirect过滤器配置
将redirect方法的目标URL改为包含{path}占位符的形式,该占位符会自动替换为原请求的路径部分:
@Bean public RouteLocator routes(RouteLocatorBuilder builder) { String auth = username + ":" + password; String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes()); return builder.routes() .route("geoApi", r -> r .path("/site/rest/services/**") .filters(f -> { f.setRequestHeader(HttpHeaders.AUTHORIZATION, "Basic " + encodedAuth); // 使用{path}占位符保留原请求路径 f.redirect(302, "https://internal-api.com{path}"); return f; }) .uri("https://internal-api.com")) .build(); }
额外说明
- 如果原请求包含查询参数(比如
http://localhost:8080/site/rest/services/testservice/1?id=123),想要保留查询参数的话,可以在目标URL后添加{query}占位符:f.redirect(302, "https://internal-api.com{path}{query}"); - 注意:302重定向是客户端发起新请求,此时你设置的
Authorization请求头不会被携带到新请求中。如果需要在代理过程中传递认证信息,可能需要考虑使用RewritePath过滤器结合反向代理(而非重定向),具体取决于你的业务需求。
内容的提问来源于stack exchange,提问作者sandrooco
相关产品推荐
相关产品推荐

