【发布时间】:2014-10-16 20:04:10
【问题描述】:
我们有一个带有嵌入式 Tomcat 的 Spring Boot (Spring MVC) 应用,位于 Apache SSL 代理后面的专用应用服务器上。
代理服务器上的SSL端口是4433,转发到appserver上的8080端口。
所以代理服务器的 URL 是这样转发的:
https://proxyserver:4433/appname >>forward>> http://appserver:8080/
在没有代理的情况下运行时,首先发生的是
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 Use Tomcat behind a front-end proxy server
我们在 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”部分。在应用服务器上,应用程序植根于“/”。当通过代理时,应如何指示 Spring 将“/appname”包含在发送回客户端的所有 URL 中?
【问题讨论】:
-
有点令人不安的是,关于 JVM 属性:server.tomcat.protocol-header, server.tomcat.remote-ip-header ..... at docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/… 它们在最后一个之后用下划线编写点,而docs.spring.io/spring-boot/docs/current/reference/html/… 则用破折号书写。哪个是对的?我尝试了这两种变体,但没有解决上述问题。
-
应该是下划线
server.tomcat.remote_ip_header=x-forwarded-forserver.tomcat.protocol_header=x-forwarded-proto -
Spring boot 对属性使用宽松的绑定,因此它们是下划线还是破折号甚至是圆点都可能无关紧要
标签: spring tomcat spring-security reverse-proxy spring-boot