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 успешно, но /calls с установленным заголовком Host нет, потому что Spring считает /calls префикс и удаляет его, что приводит к пустому пути. /calls/calls путь с Host заголовок успешен, потому что 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"))

2 ответа

Решение

Ты можешь сделать это

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

Поведение удаления является нормальным, вы можете использовать другой маршрут для / calls, и для этого маршрута вы не добавляете предложение удаления префикса.

Официальный документ: https://cloud.spring.io/spring-cloud-gateway/reference/html/#the-stripprefix-gatewayfilter-factory

Другие вопросы по тегам