Heroku中的SSL重定向
我在让我的Java Web应用程序在Heroku上运行时遇到了麻烦。
这就是我所拥有的:
使用Spring Security的Java Web应用程序(标准war文件),我的web.xml中有一个安全约束部分,如下所示:
SSL URLs /j_spring_security_check /secure/account/create /register /login/* / GET POST CONFIDENTIAL
当我将WAR文件部署到Heroku(使用Atlassian Bamboo的Heroku部署插件)并且应用程序启动时,我最终在浏览器中收到“太多重定向”错误 – 看起来它与之间的轻弹有关https和http,但我无法弄清楚我需要做些什么来修复它。
我现在只想使用背负式SSL,因为SSL插件对于我的爱好项目而言相当昂贵(每月20美元)。
我通过在Spring Security配置中使用requires-channel
和Tomcat的RemoteIpValve
来解决类似的问题。 如果您不使用Spring Security,配置RemoteIpValve
应该足够了(以下假设您使用优秀的webapp-runner
作为您的容器)我想有一个等同于jetty-runner,但我不知道…
问题是Heroku的Web /路由层处理SSL,并将请求作为普通HTTP代理到您的webapp。 所以Tomcat不知道请求在其他地方是安全的(SSL卸载) RemoteIpValve
实际上是通过查看HTTP RemoteIpValve
覆盖Tomcat看到的协议,端口和IP地址(反过来,如何评估request.isSecure()
)由处理SSL的代理服务器设置。
使用以下内容创建context.xml
:
这三个标头( x-forwarded-for
, x-forwarded-proto
和x-forwarded-port
)由Heroku的路由层自动发送。
接下来,确保将文件复制到maven目标目录中的某个位置(我将其放在与webapp-runner
本身相同的目录中)。 在pom.xml
:
${basedir}/src/main/resources/META-INF context.xml ${project.build.directory}/dependency
最后,确保webapp-runner指向context.xml(例如,使用支持context-xml
参数的webapp-runner 7.0.30.1)。 在您的Procfile
:
web: java $JAVA_OPTS -jar target/dependency/webapp-runner.jar --context-xml target/dependency/context.xml ...etc...
最后一点,我使用Spring安全requires-channel
通过翻转环境变量在HTTP和HTTPS之间来回切换 – 在我的本地开发盒上取消设置以便于配置,在Heroku上设置(通过heroku config
)有选择地在不同的环境中强制使用SSL。
希望这对你有用……
我使用webapp-runner面临完全相同的问题并通过简单地使用--proxy-base-url https://example.com
修复它,如此处所述
@bimsapi提供的解决方案为我工作。 我使用这个解决方案遇到了两个问题。 一旦我解决了那些它完美的工作。
首先,我必须将context.xml文件直接放在war文件的根目录下的META-INF目录中。
其次,您提供给–context-xml属性的context.xml文件的路径是文件系统上根目录而不是war文件的相对路径。 例如–context.xml ./tartget/myapp/META-INF/context.xml。
在我给出–context.xml META-INF / context.xml之前,这是错误的。