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

标签 java apache tomcat spring-boot kubernetes

背景

我最近将我的 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/

相关文章:

java - hadoop中的Map输出值中哪种数据结构最好有多种类型?

java - 在 Web 应用程序中部署模块

java - 如何解决启动 Web 连接器 Jboss 时出错的问题?

java - 如何在没有新 Activity 的情况下创建子菜单?安卓编程

java - 有没有一种优雅的方式在 Springs @Query 注释中使用枚举?

php - 重写 URL 的最有效方法

python - WSGI/Django : pass username back to Apache for access log

java - Tomcat 如何在内部处理 session ?

java - 在 Android 中共享联系人

php - 在 Windows 中向 PHP 添加 Mysqli 扩展时出错