AWS ELB 和 Tomcat7 服务器的 HTTP 到 HTTPS 重定向

HTTP to HTTPS Redirects for AWS ELB and Tomcat7 server

我有一个子域 (test.XXXX.com) 指向接受 HTTP(80) 和 HTTPS(443) 请求的 AWS ELB。我已经为 HTTPS 连接配置了 443 证书的 SSL。 我尝试通过更改 web.xml 和 server.xml 在 Tomcat 级别进行 HTTP 到 HTTPS 重定向,如

中所述

http://www.journaldev.com/160/steps-to-configure-ssl-on-tomcat-and-setup-auto-redirect-from-http-to-https

但问题是我需要一个不执行 HTTP 到 HTTPS 重定向的 AWS ELB 健康检查端点。 我尝试过不同的解决方案,但没有 success.I 也尝试过

   <security-constraint>
                <web-resource-collection>
                        <web-resource-name>Protected Context</web-resource-name>
                        <url-pattern>/*</url-pattern>
                </web-resource-collection>

                <user-data-constraint>
                        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
                </user-data-constraint>
    </security-constraint>
   <security-constraint>
                <web-resource-collection>
                        <web-resource-name>Protected Context</web-resource-name>
                        <url-pattern>/XXXXX/XXXXXX.html</url-pattern>
                </web-resource-collection>

    </security-constraint>

我的服务器 server.xml 的配置如下

<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />


<Connector port="443" maxThreads="2000" scheme="https" secure="true" SSLEnabled="true" keystoreFile="/home/XXXXX/XXXXX.keystore" 
               keystorePass="XXXXX" clientAuth="false" keyAlias="XXXX" 
               sslProtocol="TLS" protocol="org.apache.coyote.http11.Http11Protocol"/>

但是当尝试通过浏览器访问它时,它给出异常 ERR_TOO_MANY_REDIRECTS。

我有解决你问题的方法,但它与 tomcat 无关。 您可以使用 Cloudfront 发行版。
让我强调一些通过 Cloudfront Distribution 实现这一目标的关键配置:

  • 选择网络分配
  • Select 您在源域名下拉列表中的 ELB。 origin Path 将为空,Origin Id 只是您选择的标识符。
  • 现在在默认缓存行为设置下,请为查看器协议策略选择将 HTTP 重定向到 HTTPS。请仔细检查所有其他设置,select 适合您的设置。它们应该相当简单明了。 (请输入您的域名 - test.xxxx.com 备用域名)
  • 点击创建分发。
  • 创建分发后,转到分发并转到行为选项卡。
  • 在这里您会看到已经有一个默认条目。转到创建行为,输入您的路径模式。所以如果你的 healthcheck url 是 test.xxxx.com/healthcheck 然后你的路径模式变成 /healthcheck.
  • 请为查看器协议策略选择 HTTP 和 HTTPS。
  • 最后,请在您的 route53 中为您的域添加一条记录,并将其指向您刚刚创建的云端分配。

如此有效,它所做的是,它取消了 tomcat 的重定向,并在云端级别进行处理。默认情况下,所有请求都重定向到 HTTPS,而仅允许 /healthcheck 路径 HTTP 请求。不需要在较低级别处理重定向。 如果这对您有用,请告诉我。 另外,请注意 route53 和 cloudfront 更改需要时间来传播。所以请充分等待测试成功

由于您在 Tomcat 中使用 HTTP 到 HTTPS 重定向,最简单的解决方案是将重定向视为有效响应。

您不能使用经典的 Elastic Load Balancer 执行此操作,但可以使用新的 Application Load Balancer

我建议您将负载均衡器切换到新的 ALB 并configure the health check接受 200-399 作为正常响应代码。

您还可以通过切换到新的应用程序负载均衡器获得其他好处,例如每小时更便宜,并且可以根据路径和主机名路由到不同的实例组。

ELB 修复检查可以配置为使用 https 端点,勾选选项:ping protocol http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-healthchecks.html

Ping Protocol

The protocol to use to connect with the instance.

Valid values: TCP, HTTP, HTTPS, and SSL

Console default: HTTP

CLI/API default: TCP

您也可以在任一端口 80/443 中尝试 TCP,这将忽略所有重定向。

现在 AWS ELB 支持两种新操作:重定向和固定响应。您可以将这些操作配置为基于内容的路由规则的一部分,使您能够将此功能卸载到负载平衡器

通过重定向操作,负载平衡器可以将传入请求从一个 URL 重定向到另一个 URL。这包括将 HTTP 请求重定向到 HTTPS 请求的能力。