【问题标题】:Unable to forward Request to URI with context-path无法使用上下文路径将请求转发到 URI
【发布时间】:2021-02-23 19:11:39
【问题描述】:

我无法将我的请求转发到带有 contextpath 的 URI。

例如,我正在请求我的 Spring 云网关服务器

http://localhost:1010/mygateway/server/date

我希望它转发到

http://myapiserver.com/xyzapi/v1/server/date

但它给了我 404

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route("api-server-date", r -> r.host("**")
                    .and()
                    .path("/mygateway/server/date")
                    .filters(f -> f.stripPrefix(1))
                    .uri("https://myapiserver.com/xyzapi/v1"))
            .build();
}

当我将我的配置更改为这个时它可以工作

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route("api-server-date", r -> r.host("**")
                    .and()
                    .path("/mygateway/xyzapi/v1/server/date")
                    .filters(f -> f.stripPrefix(1))
                    .uri("https://myapiserver.com"))
            .build();
}

我不知道我提供的配置有误。它应该可以工作。

我只想使用

https://myapiserver.com/xyzapi/v1

作为我的 URI。这意味着在附加传入 url 后,到我的 spring 云网关服务器的所有传入流量都应该转发到这个 URL

请提出什么问题?还是 Spring Cloud Gateway 做不到?

【问题讨论】:

  • 您是否使用与server.servlet.context-path 等效的内容设置上下文路径?好像是这样,但我不清楚。
  • 是的,在我的实际 API 服务器中,我正在设置 @RobEvans

标签: java spring-boot reverse-proxy spring-cloud spring-cloud-gateway


【解决方案1】:

我认为您想要的(查看在线示例)是:

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
  String requestHandlerUrl = "http://myapiserver.com/xyzapi/v1/server/date";
  return builder.routes()
          .route("api-server-date", r -> r.host("**")
             .and()
             .path("/mygateway/server/date")
             .filters(f -> f.stripPrefix(1))
             .uri(requestHandlerUrl)
          .build();
}

... 这样,对部署您的应用程序的任何主机发出的请求都会被转发/传递到requestHandlerUrl 作为目的地。

看起来/mygateway/server/date 是您实际要处理请求的 URL 的“快捷方式”或别名。

这里有一些例子:https://cloud.spring.io/spring-cloud-gateway/multi/multi__configuration.html#_fluent_java_routes_api

【讨论】:

  • 正如我告诉你的那样,这是行不通的!我也试过了。它给了我 404。它正在向myapiserver.com/xyzapi/v1/server/date/server/date 发出请求跨度>
  • 在这种情况下似乎很接近解决方案...尝试从 requestHandlerUrl 中删除 server/date 并尝试一下。如果它不起作用,请将其重新添加并将 .path("/mygateway/server/date") 更改为 .path("/mygateway") 其中之一是在最终 URL 中添加一个额外的 /server/date,并且可以通过外观将其删除
  • 您建议的 requestHandlerUrl 应该是 myapiserver.com/xyzapi/v1 我希望通过附加传入请求的某些部分来将所有到达我的 SCG 的请求转发到此 requestURL。此外,我只想授予对少数选定 api 的访问权限,因此直接在 requestHandlerUrl 中附加 /server/date 是不可行或不正确的
猜你喜欢
  • 1970-01-01
  • 2013-07-22
  • 2017-03-14
  • 1970-01-01
  • 2011-05-15
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
相关资源
最近更新 更多