转发标头在Spring Boot + Kubernetes中不起作用

Maz*_*mar 7 java apache tomcat spring-boot kubernetes

背景

我最近将我的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
Run Code Online (Sandbox Code Playgroud)

如果未经过身份验证,管理页面会将用户重定向到登录页面.这应该是一个重定向到:

https://example.com/login
Run Code Online (Sandbox Code Playgroud)

但是,我的应用程序将用户重定向到:

http://example.com/login
Run Code Online (Sandbox Code Playgroud)

然后Apache再次将用户重定向到:

https://example.com/login
Run Code Online (Sandbox Code Playgroud)

我试过的

我检查了我的日志,以确保我的应用程序接收请求包括X-Forwarded-Proto: https报头,这从我的理解应该在重定向响应HTTPS的位置标头.

正如几篇Stack Overflow帖子中所提到的,我尝试添加server.use-forward-headers=true到我的application.properties文件中,但这没有做任何事情.我也尝试添加server.tomcat.protocol-header=X-Forwarded-Proto它,但这没有做任何事情(从我读到的,无论如何是默认).

其他说明

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

Maz*_*mar 5

我想到了。我的错误是假设那networkCIDR是IP所返回的IP地址request.getRemoteAddr(),而实际上是我的k8s内部集群IP。鉴于请求来自Apache,而Apache也位于集群中,因此这是有道理的。内部群集IP RemoteIPValve不在内部代理列表中,因此未使用转发头。

通过使用在AND我的内部集群IP中指定的默认值将server.tomcat.internal-proxies属性添加到my中,一切都会按预期进行。application.propertiesRemoteIpValve

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