IIS 强制 https 重定向导致 503 错误
Posted
技术标签:
【中文标题】IIS 强制 https 重定向导致 503 错误【英文标题】:IIS forced https redirect causes 503 error 【发布时间】:2017-03-09 04:17:09 【问题描述】:我在 AWS 上有一个由 Elastic Beanstalk 提供支持的负载平衡环境。 SSL 证书应用于负载均衡器。为了强制 https 重定向,我遵循了这篇文章Redirect to https through url rewrite in IIS within elastic beanstalk's load balancer 中接受的答案。这些是我在 web.config 中编写的确切代码行
<rewrite>
<rules>
<rule name="Force Https" stopProcessing="true">
<match url="healthcheck.html" negate="true" />
<conditions>
<add input="HTTP_X_FORWARDED_PROTO" pattern="https" negate="true" />
</conditions>
<action type="Redirect" url="https://HTTP_HOSTREQUEST_URI" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
但这会导致环境健康在发布后 5 分钟内变为红色,并且网站开始出现 503 错误。如果我删除它们,则没有错误。请帮我解决这个威胁,以便 https 重定向成功。在发布后的前 5 分钟内,http 请求成功重定向到 https。只有在 503 错误开始出现之后。
【问题讨论】:
【参考方案1】:如果您的 ELB 报告 HTTP 状态代码 503,这通常意味着它后面没有运行良好的 EC2 实例。
请参阅 ELB 故障排除指南:http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/ts-elb-error-message.html#ts-elb-errorcodes-http503
所以现在的问题是为什么?
基本上,您的健康检查失败了。
在您粘贴的代码的 sn-p 中,您强制将所有请求的 HTTP 重定向到 HTTPS,healthcheck.html
除外。这个想法是这个单一的排除应该是你的健康检查。
要解决此问题:
确保对 EC2 实例进行运行状况检查,当通过 HTTP 直接访问 EC2 实例时返回 200。运行状况检查必须返回 200,否则 ELB 将无法通过检查,您的 EC2 实例将被视为不健康。
确保您的 ELB 配置运行状况检查与 EC2 实例运行状况检查路径匹配。在运行状况检查路径的开头包含一个前导 /
。
将运行状况检查路径放入您的<rewrite>
规则中,省略前导/
。您可能需要在开头添加 ^
,在末尾添加 $
,因为这是正则表达式比较。
如果<rewrite>
规则中的值与您 ELB 中的实际运行状况检查不匹配,则您的 ELB 将收到 HTTP 到 HTTPS 重定向响应,这被视为失败。
【讨论】:
嗨,马特,即使环境已启动,envurl/healthcheck.html 也会返回 404 错误。我也尝试从规则中删除该行,仍然没有帮助。 所以您的问题是/healthcheck.html
返回 404。您需要一个返回 200 的运行状况检查。那么 (a) 您的 EC2 实例上正确的运行状况检查是什么? (b) 将其放入您的 ELB 配置中,并且 (c) 将其放入 <rewrite>
规则中。
我已经通过回答进行了调整以更好地解决问题。
我如何知道我的实例的健康检查 url?我查看了控制台,但找不到它
否,因为您的 EC2 实例不接受 HTTPS 连接。以上是关于IIS 强制 https 重定向导致 503 错误的主要内容,如果未能解决你的问题,请参考以下文章
将规则重写为IIS以将HTTPS重定向到HTTP会导致null HttpContext.Request.ContentType