首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring网关-如果存在条带前缀

Spring网关-如果存在条带前缀
EN

Stack Overflow用户
提问于 2018-12-03 11:43:48
回答 2查看 7.8K关注 0票数 4

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

我想出了以下代码,其中我认为"sip“只是一个前缀:

代码语言:javascript
复制
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路径段。

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

我在考虑每项服务有两条路线,但看起来不太好,尽管它达到了目标:

代码语言:javascript
复制
.route(r -> r.header("Host", "form").uri("http://form:8080"))
                .route(r -> r.path("/form/**")
                        .filters(f -> f.stripPrefix(1))
                        .uri("http://form:8080"))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-08 13:14:38

你可以这样做

代码语言:javascript
复制
.route(r -> r.host("sip")
            .or()
            .path("/sip/**")
            .filters(f -> f.rewritePath("^/sip", ""))
            .uri("http://sip:8080")
票数 5
EN

Stack Overflow用户

发布于 2021-10-28 08:16:11

删除行为是正常的,您可以为/calls使用另一条路由,而对于该路由,则不添加remove前缀子句。

官方文件:https://cloud.spring.io/spring-cloud-gateway/reference/html/#the-stripprefix-gatewayfilter-factory

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53593164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档