【发布时间】:2018-03-23 18:11:46
【问题描述】:
背景
我最近将我的 Spring 应用程序迁移到 Spring Boot(带有嵌入式 Tomcat),我目前正在将它迁移到 Kubernetes。作为迁移到 Kubernetes 的一部分,我将 Apache 配置分离到它自己的服务中,并在 Kubernetes 中部署以充当我的 Spring Boot 应用程序的代理。
我当前的设置是带有 LoadBalancer 服务的 Apache,它接受来自世界各地的请求。这会接收这些请求并将它们转发到我的 Spring Boot 应用程序,该应用程序具有 ClusterIP 服务。
另外需要注意的是:我的 Apache 将所有 http 重定向到 https。
问题
每当我的 Spring Boot 应用程序向客户端返回重定向时,响应中的位置标头是 http 而不是 https(只有通过 https 发出的请求才会通过 Apache 代理到达我的应用程序)。
示例:
未登录用户前往:
https://example.com/admin
如果未通过身份验证,管理页面会将用户重定向到登录页面。这应该是一个重定向到:
https://example.com/login
但是,我的应用程序将用户重定向到:
http://example.com/login
然后用户被 Apache 再次重定向到:
https://example.com/login
我的尝试
我检查了我的日志,以确保我的应用收到的请求包含 X-Forwarded-Proto: https 标头,据我了解,这应该在重定向响应 https 中使用 location 标头。
正如几篇 Stack Overflow 帖子中提到的,我尝试将 server.use-forward-headers=true 添加到我的 application.properties 文件中,但这没有任何作用。我也尝试用它添加server.tomcat.protocol-header=X-Forwarded-Proto,但这也没有做任何事情(根据我的阅读,无论如何都是默认设置)。
其他说明
- 我的集群的
networkCIDR包含在Tomcat 的RemoteIPValve内部代理列表中 -
X-Forwarded-For似乎也没有影响,所以我认为问题在于所有转发标题
【问题讨论】:
标签: java apache tomcat spring-boot kubernetes