为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牧羊人nacy 2022-12-28 16:24:55
这个问题似乎已被多次询问,但对于这种特殊情况,我还没有找到合适的解决方案。该应用程序是一个 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 标头。这怎么能解决?
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

你可以在你的 springboot 配置中设置这个道具:

server.tomcat.use-relative-redirects=true

参考:https ://github.com/spring-projects/spring-boot/issues/22908


查看完整回答
反对 回复 2022-12-28
?
守候你守候我

TA贡献1802条经验 获得超10个赞

为了完成这项工作,我必须禁用自定义 Tomcat 上下文的上下文根重定向:


@Configuration

class 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)

        }

    }


}


查看完整回答
反对 回复 2022-12-28
  • 2 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号