Springdoc OpenAPI ui 不遵守“位置”中的上下文路径

Posted

技术标签:

【中文标题】Springdoc OpenAPI ui 不遵守“位置”中的上下文路径【英文标题】:Springdoc OpenAPI ui does not honor context-path in "location" 【发布时间】:2020-09-20 23:38:05 【问题描述】:

设置:

我在 1.4.0 版(通过 Maven)中使用 Java 库 springdoc-openapi-ui,在一个简单的 spring-boot 项目中没有任何自定义。

Swagger页面是在下面生成的 https://my-url.com/my-context-path/swagger-ui/index.html

以及下面的 api-docs https://my-url.com/my-context-path/v3/api-docs/

这两项工作,我可以联系到他们。到目前为止一切顺利!

现在的问题:

当简单地导航到 https://my-url.com/my-context-path/swagger-ui.html 时,我在响应标头中设置了一个 HTTP 状态 302 和一个 location 属性,该属性应该将我从上面重定向到 swagger 页面(我假设)。

但是,location 属性中的 URL 错过了上下文路径!它看起来像这样: https://my-url.com/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config

它重定向到一个不存在的页面,我收到 404 错误代码。请注意,configUrl 似乎也缺少上下文路径。

任何想法为什么会发生这种情况以及如何解决?

这个 Github Issue 似乎是同样的问题,但最后说问题已解决:https://github.com/springdoc/springdoc-openapi/issues/37 这是我之前的版本。

【问题讨论】:

【参考方案1】:

好的,所以问题是springdoc-openapi-ui 不知道您的应用上下文路径,除非它是在 Spring Boot 中定义的,这可能对每个人都不可能。

希望它确实支持可以由您的网关发送的非标准标头X-Forwarded-Prefix

我的情况(Kubernetes),只需添加nginx.ingress.kubernetes.io/x-forwarded-prefix: "true"即可在您的图表中配置Ingress

在您的应用程序配置中,您还需要指定

server:
  forward-headers-strategy: framework

使用 Spring 对处理转发的标头的支持。

来源:

https://github.com/kubernetes/ingress-nginx/issues/3670

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#x-forwarded-prefix-header

https://github.com/springdoc/springdoc-openapi/issues/607

【讨论】:

在链接 kubernetes.github.io/ingress-nginx/user-guide/… 中,属性 nginx.ingress.kubernetes.io/x-forwarded-prefix 的可接受值应该是字符串而不是布尔值。你确定它适用于“真”吗?【参考方案2】:

没有关于上下文路径使用的已知问题。如您所见,#37 已解决,并且报告已确认!

只要确保您遵循在标准 spring-boot 应用程序上设置上下文路径的说明即可。

您可以在不同的演示示例中测试上下文路径的配置:

https://github.com/springdoc/springdoc-openapi-demos

如果您有任何问题,您可以通过提供最小/可重现的样本或使用重现问题的单元测试来记录问题。

【讨论】:

看来我的问题是由于上下文路径实际上不是我的应用程序的一部分(server.servlet.context-path 未设置),而是由于部署应用程序的“网关”。当我在本地运行我的服务时,没有上下文路径并且一切正常,但是一旦部署,该服务就可以在 /my-context-path 下访问。因此,设置server.servlet.context-path 对我来说不是一个选项,因为应用程序实际上没有上下文路径。您知道解决方法吗? @scrobe 你是对的,我在 Kubernetes 中遇到了同样的问题,入口设置的上下文路径。

以上是关于Springdoc OpenAPI ui 不遵守“位置”中的上下文路径的主要内容,如果未能解决你的问题,请参考以下文章

springdoc-openapi-ui + swagger 不理解 @PathVariable required = false 标志

在 springdoc-openapi-ui 中为基本身份验证启用授权按钮

springdoc-openapi swagger-ui 中的 CSRF 支持

使用 Spring Security 启用 Swagger springdoc-openapi-ui (OpenAPI 3.0) - 无法访问 swagger-ui.html (401)

在 SpringDoc OpenAPi 中未禁用 petstore URL

springdoc-openapi 在没有服务器的情况下生成 openapi yaml