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)