1

我想做一些类似于 SSL 重定向的事情,但略有不同。

我有一个负载均衡器配置为侦听端口 80 (HTTP) 和 443 (HTTPS)。

负载均衡器没有能力进行任何 SSL 重定向,因为如果这样做,我的生活就太容易了(它是亚马逊的弹性负载均衡器,顺便说一句)。

我有 Tomcat (tcServer) 监听两个端口:80 和 81(都是 HTTP)。

LB 上的 80 端口会将您带到 tomcat 上的 80 端口。LB 上的 443 端口会将您带到 tomcat 上的 81 端口(相同的 Web 应用程序)。

我想要的是让tomcat上的端口80将您发送回负载均衡器上的443。

并且所有这些都无需触及已部署的 web 应用程序。

有任何想法吗?

4

2 回答 2

0

一种解决方法:创建一个不包含任何页面的简单 Web 项目,只是一个用于 404 错误的简单错误页面,它将每个请求重定向到负载均衡器的绝对 URL(带有 https:// 链接)。然后将 Tomcat 配置为在端口 80 上使用此应用程序(即部署为 ROOT.war)并在端口 81 上为您的原始应用程序提供服务。

于 2011-09-16T21:35:14.817 回答
0

所以显然我过度思考了这一点(好吧,基于我正在阅读的一些论坛,我有点过度思考它)。无论如何,这就是有效的方法(并且正在有效-我们正在生产中)。

  1. 去获取 Tuckey 的 URLRewrite 过滤器并首先将它添加到 /* 上的 web.xml 中
  2. 将 urlrewrite.xml 添加到 /WEB-INF/ 并放入默认配置。
  3. 在您的应用程序(来自本地主机)上点击 /rewrite-status 以确保它正常运行。
  4. 创建一个规则,将查找 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,您有两种选择。

  1. 您可以将 urlrewrite.xml 直接包含在您的 WAR 中,它会自动工作。在这种情况下,您将需要添加一个规则来为您的开发环境禁用它(您可以在 port="80" 上添加一个额外的条件,以便仅在侦听端口 80 时启用重写,这是生产,而开发可能是在 8080 上)。
  2. 您可以将 URLRewrite 添加到 Tomcat lib 目录,并将过滤器添加到 Tomcat 的主 web.xml。这样做的好处是您不必修改您的应用程序。
于 2011-09-18T04:12:33.490 回答