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 到 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 请求的能力。
我有一个子域 (test.XXXX.com) 指向接受 HTTP(80) 和 HTTPS(443) 请求的 AWS ELB。我已经为 HTTPS 连接配置了 443 证书的 SSL。 我尝试通过更改 web.xml 和 server.xml 在 Tomcat 级别进行 HTTP 到 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 请求的能力。