我需要Spring将请求路由到基于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的请求成功,但是具有主机头集的/calls没有成功,因为/calls认为/calls是一个前缀并删除它,从而导致空路径。带有/calls/calls头的Host路径成功,因为calls只删除了第一个calls路径段。
如何将主机和路径一起使用,只有当前缀与定义的值匹配时才能删除?
我在考虑每项服务有两条路线,但看起来不太好,尽管它达到了目标:
.route(r -> r.header("Host", "form").uri("http://form:8080"))
.route(r -> r.path("/form/**")
.filters(f -> f.stripPrefix(1))
.uri("http://form:8080"))发布于 2019-01-08 13:14:38
你可以这样做
.route(r -> r.host("sip")
.or()
.path("/sip/**")
.filters(f -> f.rewritePath("^/sip", ""))
.uri("http://sip:8080")发布于 2021-10-28 08:16:11
删除行为是正常的,您可以为/calls使用另一条路由,而对于该路由,则不添加remove前缀子句。
官方文件:https://cloud.spring.io/spring-cloud-gateway/reference/html/#the-stripprefix-gatewayfilter-factory
https://stackoverflow.com/questions/53593164
复制相似问题