小编典典

在Apache代理后面具有嵌入式Tomcat的Spring Boot

spring-boot

我们在Apache SSL代理后面的专用应用程序服务器上有一个带有嵌入式Tomcat的Spring Boot(Spring MVC)应用程序。

代理服务器上的SSL端口为4433,转发到应用服务器上的端口8080。

因此,代理服务器的URL正在转发,如下所示:

https://proxyserver:4433/appname   >>forward>>   http://appserver:8080/

当运行WITHOUT代理时,发生的第一件事是
Spring Security重定向请求,例如:

http://appserver:8080/   >>redirect>>   http://appserver:8080/login

以显示登录表单,通过扩展WebSecurityConfigurerAdapter

  ...
  httpSecurity.formLogin().loginPage("/login") ...
  ...

在没有代理的情况下,它可以正常工作,但是在使用代理的情况下,需要更改重定向,
因此Spring应该改为重定向到相应的代理URL,例如:

http://appserver:8080/   >>redirect>>   https://proxyserver:4433/appname/login

但还没有成功。

我正在尝试应用此解决方案: 59.8在前端代理服务器后面使用Tomcat

我们已经在Apache中配置了 mod_proxy
,并验证它是否发送了预期的标头:

X-Forwarded-For: xxx.xxx.xxx.xxx
X-Forwarded-Host: proxyserver
X-Forwarded-Port: 4433
X-Forwarded-Proto: https

该应用程序以以下参数启动:

export ARG1='-Dserver.tomcat.protocol-header=x-forwarded-proto' 
export ARG2='-Dserver.tomcat.remote-ip-header=x-forwarded-for'
java $ARG1 $ARG2 -jar webapp.jar

重定向仍然不起作用。

它将保持本地重定向,http://appserver:8080/login客户端无法访问该重定向 。

为了使此方案正常工作,我们还有什么需要做的吗?

更新

另外,我担心代理URL中的“ / appname”部分。在appserver上,应用程序植根于“
/”。通过代理时,应如何指示Spring在发送回客户端的所有URL中都包含“ / appname”?


阅读 354

收藏
2020-05-30

共1个答案

小编典典

前几天我遇到了同样的问题。在对Spring Boot 1.3进行一些调试之后,我发现了以下解决方案。

1. 您必须在Apache代理上设置标头:

<VirtualHost *:443>
    ServerName www.myapp.org
    ProxyPass / http://127.0.0.1:8080/
    RequestHeader set X-Forwarded-Proto https
    RequestHeader set X-Forwarded-Port 443
    ProxyPreserveHost On
    ... (SSL directives omitted for readability)
</VirtualHost>

2. 您必须告诉Spring Boot应用程序使用这些标头。因此,将以下行放在application.properties中(或Spring
Boots可以理解属性的任何其他位置):

server.use-forward-headers=true

如果正确执行这两件事,则应用程序发送的每个重定向都 不会
转到http://127.0.0.1:8080/[path],而是会自动转到https://www.myapp.com/[path]

更新1. 有关此主题的文档在此处。您应该至少阅读它,以了解该属性server.tomcat.internal- proxies定义了可信任的代理服务器的IP地址范围。

2020-05-30