Spring Cloud Gateway-去掉前缀(如果存在)



我需要Spring Cloud Gateway根据Host头或路径前缀将请求路由到微服务。在任何情况下,必须从路径中删除路径前缀,但前提是设置了路径前缀。

我想出了以下代码,我认为只有"sip"是前缀:

public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.host("sip")
.or()
.path("/sip/**")
.filters(f -> f.stripPrefix(1))
.uri("http://sip:8080")
)
.build();
}

问题是Spring会删除路径的第一段,即使它不是前缀。

例如,路径为/sip/calls的请求成功,但设置了Host标头的/calls没有成功,因为Spring将/calls视为前缀并将其删除,从而导致空路径。具有Host标头的/calls/calls路径成功,因为Spring仅移除第一个calls路径段。

如何将主机和路径一起使用,只有在前缀与定义的值匹配时才能删除前缀?

ps我想每个服务有两条路线,但看起来不太好,尽管它达到了目标:

.route(r -> r.header("Host", "form").uri("http://form:8080"))
.route(r -> r.path("/form/**")
.filters(f -> f.stripPrefix(1))
.uri("http://form:8080"))

你可以这样做

.route(r -> r.host("sip")
.or()
.path("/sip/**")
.filters(f -> f.rewritePath("^/sip", ""))
.uri("http://sip:8080")

删除行为是正常的,您可以为/调用使用另一个路由,对于该路由,您不添加remove-prefix子句。

官方文件:https://cloud.spring.io/spring-cloud-gateway/reference/html/#the-带前缀网关过滤器工厂

相关内容

  • 没有找到相关文章

最新更新