我们在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与
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客户端无法访问该重定向 。
http://appserver:8080/login
为了使此方案正常工作,我们还有什么需要做的吗?
另外,我担心代理URL中的“ / appname”部分。在appserver上,应用程序植根于“ /”。通过代理时,应如何指示Spring在发送回客户端的所有URL中都包含“ / appname”?
前几天我遇到了同样的问题。在对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地址范围。
server.tomcat.internal- proxies