Elastic Load Balancer将HTTPS重定向到Tomcat服务器的问题

时间:2012-03-29 12:13:06

标签: tomcat spring-security amazon-web-services http-redirect amazon-elb

我有一个ELB(Amazon Elastic Load Balancer)配置为在HTTPS上对最终用户请求进行负载均衡,在后端我的应用程序在HTTP上配置的Tomcat服务器上运行。

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

我们如何解决此问题?唯一的选择是在enduser-ELB和ELB-tomcat上都有HTTPS,或者我在这里遗漏了一些东西?

2 个答案:

答案 0 :(得分:10)

ELB设置X-Forwarded-Proto标头,允许您告知客户端用于连接负载均衡器的协议。请参阅documentation

您可以配置spring security以查看此标头,例如,请参阅this answer

答案 1 :(得分:0)

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

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

经过一些研究后,我得到了正确的重写规则,以这样的方式管理X-Forwarded-Proto,即使ELB卸载了SSL tomcat,现在原始请求也使用了SSL。

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

以下是步骤:

第1步:

一个。在tomcat conf文件夹下打开context.xml 湾粘贴

下面的以下行
<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

注意:这将启用全局阀门。如果需要为特定主机启用此功能,则应将其粘贴到该特定域的server.xml内

第2步:

一个。打开conf / server.xml 湾将以下行粘贴到</Host>

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

第3步:

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

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

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

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