27

当您在弹性 beanstalk 负载平衡器后面时,如何使用 IIS 的 url 重写模块强制用户使用 ssl?

4

4 回答 4

42

由于几个原因,这比听起来更困难。一,负载均衡器负责ssl,因此从负载均衡器传递的请求永远不会使用ssl。如果您使用传统的重写规则,您将获得无限循环的重定向。另一个需要解决的问题是,如果 AWS 运行状况检查收到重定向响应,它将失败。

  1. 解决方案的第一步是创建一个 healthcheck.html 页面并将其设置在根目录中。内容是什么并不重要。
  2. 将您的负载均衡器设置为使用 healthcheck.html 文件进行健康检查。
  3. 在您的 web.config 部分中添加以下重写规则<system.webServer><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_HOST}{REQUEST_URI}" redirectType="Permanent" />
    </rule>
    

请注意,规则匹配在我们的健康检查文件之外的任何内容上。这可以确保负载均衡器的健康检查成功,并且不会错误地将我们的服务器从负载中删除。

负载均衡器在标头中传递 X-Forwarded-Proto 值,让我们知道请求是否通过 https。如果该值不是 https,我们的规则将触发并使用 https 返回永久重定向。

于 2013-11-05T14:52:59.313 回答
13

首先,我要感谢罗斯的原始回答,它让我建立了一个对我有用的 IIS URL 重写规则,方法是使用我在我的网站落后于 AWS Elastic Load 之前使用的现有 HTTP 到 HTTPS 重定向规则平衡器。

<rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true" />
        <add input="{REMOTE_HOST}" pattern="localhost" negate="true" />
        <add input="{REMOTE_ADDR}" pattern="127.0.0.1" negate="true" />
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>

此规则允许您在 Visual Studio 中本地访问您的站点或在端口 80 上的服务器上访问您的站点,而无需通过 HTTPS 访问,因此您只需在服务器上绑定端口 80。它不会受到其他人提到的事情(重复的查询字符串等)的影响。

我个人对健康检查没有任何问题,我不需要在服务器上创建一个文件来让弹性负载均衡器 ping。我将负载均衡器设置为运行状况检查,TCP:80并且可以正常工作。

于 2016-06-16T08:45:25.000 回答
1

如果您使用的是 ELB,卢克的答案非常完美,但不适用于 ALB。对于 ALB 罗斯佩斯的答案是正确的。但是您也可以将两者结合起来,这样您就可以在本地访问站点而无需重定向到 HTTPS。

<rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
    <match url="healthcheck.html" negate="true" />
        <conditions>
            <add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true"/>
            <add input="{REMOTE_HOST}" pattern="localhost" negate="true"/>
            <add input="{REMOTE_ADDR}" pattern="127.0.0.1" negate="true"/>
            <add input="{HTTP_HOST}" pattern="localhost" negate="true"/>
        </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent"/>
</rule>
于 2017-06-22T18:48:48.747 回答
0

这适用于我的应用程序 - IIS 8.5,将 HTTP 重定向到 AWS ALB 后面的 HTTPS。关键是添加 appendQueryString="false" 以防止重定向时查询字符串重复。您可以根据需要添加用于运行状况检查和本地主机处理的陷阱。我不需要添加健康检查陷阱,因为我们将它添加到应用程序的 web.config 中,使其成为特定应用程序。我们的健康检查是域上的默认应用程序,因此它没有受到影响。

  <system.webServer>
  <rewrite>
  <rules>
          <rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
              <match url="^(.*)$" />
              <conditions>
                  <add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true"/>
              </conditions>
              <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" appendQueryString="false" redirectType="Permanent"/>
          </rule>
      </rules>
  </rewrite>

于 2018-03-11T05:36:23.200 回答