gpt4 book ai didi

java - 转发 header 在 Spring Boot + Kubernetes 中不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:31:42 27 4
gpt4 key购买 nike

背景

我最近将我的 Spring 应用程序迁移到 Spring Boot(带有嵌入式 Tomcat),目前我正在将它迁移到 Kubernetes。作为迁移到 Kubernetes 的一部分,我将 Apache 配置分离到它自己的服务中,并在 Kubernetes 中部署以充当我的 Spring Boot 应用程序的代理。

我目前的设置是 Apache,它有一个 LoadBalancer 服务,可以接受来自世界各地的请求。这会接收这些请求并将它们转发到我的 Spring Boot 应用程序,该应用程序具有 ClusterIP 服务。

同样重要的是要注意:我的 Apache 将所有 http 重定向到 https。

问题

每当我的 Spring Boot 应用程序向客户端返回重定向时,响应中的位置 header 是 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 header ,据我所知应该在重定向响应中包含位置 header https.

正如在多个 Stack Overflow 帖子中提到的,我尝试将 server.use-forward-headers=true 添加到我的 application.properties 文件中,但这没有任何作用。我还尝试添加 server.tomcat.protocol-header=X-Forwarded-Proto ,但这也没有任何作用(据我所知,这是默认设置)。

其他说明

  • 我的集群的 networkCIDR 包含在 Tomcat 的 RemoteIPValve 内部代理列表中
  • X-Forwarded-For 似乎也没有影响,所以我认为问题出在所有转发 header 上

最佳答案

我想通了。我的错误是假设 networkCIDRrequest.getRemoteAddr() 返回的 IP 地址,而实际上它是我的 k8s 内部集群 IP。这是有道理的,因为请求来自 Apache,它也在集群内。内部集群 IP 不在内部代理列表中,因此 RemoteIPValve 没有使用转发 header 。

通过将 server.tomcat.internal-proxies 属性添加到我的 application.properties 以及在 RemoteIpValve 和我的内部指定的默认值集群 IP,一切正常。

参见 https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html#howto-customize-tomcat-behind-a-proxy-server

关于java - 转发 header 在 Spring Boot + Kubernetes 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46698882/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com