在反向代理后面嵌入 Tomcat 的 Spring Boot 应用程序在请求

这个问题似乎已被多次询问,但对于这种特殊情况,我还没有找到合适的解决方案。

该应用程序是一个 Spring Boot 1.5.x,它使用嵌入式 Tomcat 服务器并在 Openshift 上运行。后者有一个带有 HTTPS 路由的路由器,该路由终止 TLS 隧道并通过 HTTP 将流量转发到应用程序 pod。此外,它还插入 X-Forwarded- 标头(包括 X-Forwarded-Proto 标头),以便使用 https 协议组成应用程序重定向。

我已经server.use-forward-headers: true在 Spring Boot 应用程序中配置并测试了它:

1) OK -> https://ocproute/myapp/将 302 重定向到我的主页,保持 https 协议(Tomcat RemoteIpValve 处理了它)。

2) FAIL -> https://ocproute/myapp(注意没有尾部斜杠)将 302 重定向到http://ocproute/myapp/如您所见,由于尚未调用 RemoteIpValve,它已将协议更改为 http) .

日志显示 Tomcat 的 Http11InputBuffer 收到请求并在某个时候重定向它而不考虑 X-Forwarded-Proto 标头。

这怎么能解决?


牧羊人nacy
浏览 167回答 2
2回答

阿波罗的战车

你可以在你的 springboot 配置中设置这个道具:server.tomcat.use-relative-redirects=true参考:https ://github.com/spring-projects/spring-boot/issues/22908

守候你守候我

为了完成这项工作,我必须禁用自定义 Tomcat 上下文的上下文根重定向:@Configurationclass TomcatConfiguration : EmbeddedServletContainerCustomizer {    override fun customize(container: ConfigurableEmbeddedServletContainer) {        val factory = container as TomcatEmbeddedServletContainerFactory        factory.tomcatContextCustomizers = listOf(CustomCustomizer())    }    class CustomCustomizer : TomcatContextCustomizer {        override fun customize(context: Context) {            context.mapperContextRootRedirectEnabled = false            context.addServletContainerInitializer(WsSci(), null)        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java