我想要设置ELB在负载平衡器上终止SSL,并通过HTTP与后端实例通信。 我已经在ELB上传了有效的证书。 当我设置下面的configuration
ELB – HTTPS
后端 – HTTP
然后,如果应用程序在应用程序中执行redirect,客户端/浏览器将被redirect到HTTP而不是HTTPS。
虽然,如果我将ELB设置为在HTTPS上使用HTTPS和后端实例(甚至使用自签名证书),但一切正常,因为两种configuration都在HTTPS上!
我在后端实例上使用Tomcat ,不想在其间使用任何其他层(例如nginx或haproxy)
我发现这篇文章看起来很像你的问题: http : //willwarren.com/2014/01/27/running-apache-tomcat-with-ssl-behind-amazon-elb/
基本上说,更改server.xml到这个:
<Connector port="8080" protocol="HTTP/1.1" proxyPort="443" scheme="https" secure="true" proxyName="myapp.example.com" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="8443" />
我在网上find了这个难题,最后我find了一个办法。
问题是,只要httpredirect到ELB内部的https端口,它就会被redirect回80端口,从而创build一个循环。 发生这种情况是因为ELB卸载SSL,然后再次连接到端口80。
最后经过一番研究,我得到了正确的重写规则来pipe理X-Forwarded-Proto,即使ELB卸载了SSL tomcat,现在原来的请求使用了SSL。
这是在Tomcat 8上使用Tomcat Valves完成的。确保它也可以在早期版本上完成。 我已经使用阀门在Tomcat上启用了重写规则。 之后,就像在Apache上编写redirect规则一样简单。
这里是步骤:
步骤1: a。 在tomcat conf文件夹下打开context.xml b。 粘贴下面的一行
<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下托pipe,则web.xml将位于webapps / ROOT / WEB-INF下
湾 同样,如果应用程序托pipe在webapps / myappfolder下,那么web.xml将位于webapps / myappfolder / WEB-INF
C。 在WEB-INF文件夹中创build一个新的文件rewrite.config 。 并粘贴以下重写规则:
RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
这可能是一个老问题,但很难find答案。 这里有两个问题1. Tomcat web容器正在接收http请求,所以它构build的redirect将是相同的。 spring有助于达到一定的长度,但不足。 2.即使用户尝试访问HTTP,也会将用户redirect到HTTPS
第二个问题很简单,因为ELB在头部发送这个信息。 可以通过在现有的filter中添加一个简单的代码或新的代码来完成
String protocol =req.getHeader("X-Forwarded-Proto"); if(protocol!=null && "http".equalsIgnoreCase(protocol)){ rep.sendRedirect( req.getRequestURL().toString().replaceFirst("http", "https")); return; }
对于第一个问题,为我工作的解决scheme之一是在spring servlet的视图parsing器中添加附加属性(redirectHttp10Compatible)。
<bean id="tilesviewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" /> <property name="redirectHttp10Compatible" value="false" /> </bean>
如果春季只有redirect问题,生活还是不错的,但由于问题与容器本身有关,需要更多的帮助。 最终的解决scheme是操作server.xml,并为RemoteIpValve的Tomcat引擎JavaDoc添加RemoteIpValve属性
这是最后的修复。 希望有所帮助。
在Ravi的答案rewrite.config规则不适合我。 使用Tomcat 8.0.32,AWS ELB和EC2我的规则是:
# bounce all requests coming in on HTTP to HTTPS RewriteCond %{HTTP:X-Forwarded-Proto} ^http$ RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
顺便说一句:记住HTTP 301redirectcaching在浏览器,如果它一次工作,你不会看到它的工作,直到你摆脱浏览器cachingredirect