我想做一些类似于SSL重定向的事情,但略有不同。
我有一个负载均衡器配置为侦听端口80 (HTTP)和443 (HTTPS)。
负载均衡器没有能力做任何SSL重定向,因为如果它做了,我的生活就太容易了(这是亚马逊的弹性负载均衡器,顺便说一句)。
我有Tomcat (tcServer)监听两个端口:80和81(都是HTTP)。
LB上的80端口将带您到tomcat上的80端口。LB上的443端口将带你到tomcat上的81端口(相同的web应用程序)。
我想让tomcat上的80端口将您发送回负载均衡器上的443端口。
而这一切都无需触及已部署的web应用。
任何想法?
一个解决方法:创建一个简单的web项目,不包含任何页面,只是一个简单的错误页面404错误重定向到你的负载均衡器的绝对URL的每个请求(以https://链接)。然后配置Tomcat在端口80上使用这个应用程序(即作为ROOT.war部署),并在端口81上提供原始应用程序。
所以很明显我想多了(嗯,我是基于我正在阅读的一些论坛而过度思考的)。无论如何,以下是有效的方法(并且正在有效-我们正在生产中)。
- 去获取Tuckey的URLRewrite过滤器,并将其首先添加到你的web.xml上的/*
- 将urlrewrite.xml添加到/WEB-INF/中,并放入默认配置。
- 在你的应用程序(从本地主机)上点击/rewrite-status以确保它正常运行。
- 创建一个规则,查找Amazon的X-Forwarded-Proto报头,并确保其值等于"HTTPS";如果没有,请转发回https://....
就完成了。最后的配置如下:
/web - inf/web . xml
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
/web - inf/urlrewrite.xml
<rule match-type="regex">
<condition type="header" operator="notequal" name="X-Forwarded-Proto">^HTTPS$</condition>
<from>^.*$</from>
<to type="permanent-redirect" last="true">https://%{server-name}%{request-uri}</to>
</rule>
您只需要在一个端口上运行tomcat。对于如何启用URLRewrite,您有两种选择。
- 你可以直接在WAR中包含urlrewrite.xml,它会自动工作。在这种情况下,您将需要添加一个规则来在您的开发环境中禁用它(您可以在port="80"上添加一个附加条件,以便仅在侦听端口80时启用重写,这是生产端口,而开发可能在8080上)。
- 您可以将URLRewrite添加到Tomcat lib目录中,并将过滤器添加到Tomcat的主web.xml中。这样做的好处是,你不需要修改你的应用程序来做到这一点。