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 实例运行状况检查路径匹配。在运行状况检查路径的开头包含一个前导 /

    将运行状况检查路径放入您的&lt;rewrite&gt; 规则中,省略前导/。您可能需要在开头添加 ^,在末尾添加 $,因为这是正则表达式比较。

如果&lt;rewrite&gt; 规则中的值与您 ELB 中的实际运行状况检查不匹配,则您的 ELB 将收到 HTTP 到 HTTPS 重定向响应,这被视为失败。

【讨论】:

嗨,马特,即使环境已启动,envurl/healthcheck.html 也会返回 404 错误。我也尝试从规则中删除该行,仍然没有帮助。 所以您的问题是 /healthcheck.html 返回 404。您需要一个返回 200 的运行状况检查。那么 (a) 您的 EC2 实例上正确的运行状况检查是什么? (b) 将其放入您的 ELB 配置中,并且 (c) 将其放入 &lt;rewrite&gt; 规则中。 我已经通过回答进行了调整以更好地解决问题。 我如何知道我的实例的健康检查 url?我查看了控制台,但找不到它 否,因为您的 EC2 实例不接受 HTTPS 连接。

以上是关于IIS 强制 https 重定向导致 503 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IIS 中创建多个自定义 503 页面

将规则重写为IIS以将HTTPS重定向到HTTP会导致null HttpContext.Request.ContentType

错误 503 centeron 如何正确重定向

IIS 7 实现http跳转https 重定向方法

使用外部登录强制 HTTPS 重定向时出现 HTTP 500 错误

iis里URL重写重定向,http做301重定向https