9

我有一个ELB(Amazon Elastic Load Balancer)被配置为在HTTPS上负载平衡最终用户请求,在后端我有我的应用程序在配置好的Tomcat服务器上运行在HTTP上。HTTPS到Elastic Load Balancer到HTTP Tomcat服务器的重定向问题

因此,当我的最终用户向应用程序发出请求时,请求将使用HTTPS,因为他们访问ELB,现在,ELB会在HTTP内部将它重定向到tomcat服务器。在tomcat中,我的应用程序通过Spring Security受到保护,如果请求是针对受保护的资源,并且用户未登录,则用户将重定向到配置的登录页面。现在,对最终用户的重定向将通过HTTP进行,因为tomcat服务器已经将来自ELB的请求作为HTTP获取。这现在将导致404,因为我没有配置HTTP上的内部流量。

我们如何解决这个问题?唯一的选择是在enduser-ELB和ELB-tomcat上都使用HTTPS,还是我在这里丢失了一些东西?

回答

9

ELB设置了一个X-Forwarded-Proto标头,该标头允许您指出客户端用于连接到负载均衡器的协议。请参阅documentation

您可以配置弹簧安全性来查看此标题,例如,参见this answer

+1

非常感谢你..它解决了我的问题.. – 2012-03-30 06:01:44

0

我在网上找到了这个难题,最后我找到了一个办法。

问题是,只要http在内部重定向到ELB上的https端口,它就会被重定向回端口80,从而创建一个循环。发生这种情况是因为ELB卸载SSL,然后再次连接到端口80。

最后经过一番研究,我得到了正确的重写规则来管理X-Forwarded-Proto,即使ELB卸载SSL tomcat,现在原始请求使用SSL。

这是在Tomcat 8上使用Tomcat Valves完成的。确保它也可以在早期版本上完成。我已经使用阀门在Tomcat上启用了重写规则。之后,它就像在Apache上编写重定向规则一样简单。

步骤如下:

步骤1:

一个。 b。在tomcat conf文件夹下打开context.xml。粘贴以下行略低于

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> 

注:这将在全球启用阀。在这种情况下,对于需要特定主机启用,那么它应该在里面server.xml中的粘贴该特定域

第2步:

一个。打开conf/server.xml b。粘贴略高于</Host>

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> 

步骤3以下行:

一个。打开web.xml所在的文件夹。例如,如果应用程序托管在ROOT和Web下。xml将在webapps下/ ROOT/WEB-INF

b。同样,如果应用程序托管在webapps/myappfolder下,那么web.xml将位于webapps/myappfolder/WEB-INF

c。在WEB-INF文件夹中创建一个新文件rewrite.config。并粘贴以下重写规则:

RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteCond %{HTTPS} off 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]