Asp.net 在elastic beanstalk';s负载平衡器

Asp.net 在elastic beanstalk';s负载平衡器,asp.net,iis,url-rewriting,amazon-web-services,amazon-elastic-beanstalk,Asp.net,Iis,Url Rewriting,Amazon Web Services,Amazon Elastic Beanstalk,当您使用弹性beanstalk负载平衡器时,如何使用IIS的url重写模块强制用户使用ssl?这比听起来更困难,原因如下。首先,负载平衡器负责ssl,因此从负载平衡器传递的请求从不使用ssl。如果您使用传统的重写规则,您将得到无限的重定向循环。另一个需要解决的问题是,如果AWS healthcheck收到重定向响应,它将失败 解决方案的第一步是创建healthcheck.html页面并将其设置在根目录中。内容是什么并不重要 将负载平衡器设置为使用healthcheck.html文件进行运行状况检

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

这比听起来更困难,原因如下。首先,负载平衡器负责ssl,因此从负载平衡器传递的请求从不使用ssl。如果您使用传统的重写规则,您将得到无限的重定向循环。另一个需要解决的问题是,如果AWS healthcheck收到重定向响应,它将失败

  • 解决方案的第一步是创建healthcheck.html页面并将其设置在根目录中。内容是什么并不重要
  • 将负载平衡器设置为使用healthcheck.html文件进行运行状况检查
  • 在web.config的
    部分添加以下重写规则:

    <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>
    
    
    
  • 请注意,规则匹配只在我们的healthcheck文件上。这确保负载平衡器的健康检查将成功,并且不会错误地将服务器从负载中删除


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

    首先,我要感谢Ross给出的原始答案,它让我开始建立一个IIS URL重写规则,该规则通过使用我现有的HTTP到HTTPS重定向规则对我有效,我在我的网站安装AWS弹性负载平衡器之前就使用了该规则

    <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上将负载平衡器设置为运行状况检查,它可以正常工作。

    如果您使用的是ELB,但不能与ALB一起工作,则Luke的答案非常有效。对于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>
    

    这适用于我的应用程序-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>
    
    
    

    当我尝试使用此选项时,重定向的URL具有重复的查询字符串参数。例如,我的源代码是
    http://www.example.com/Action?e=1
    它被重写为
    https://www.example.com/Action?e=1&e=1
    响应很晚,但我遇到了与@mh1141完全相同的问题。要使其工作,只需删除“{REQUEST_URI}”部分。我在IIS8.5中尝试了此解决方案,但它似乎不起作用。我添加了另一个简单规则,以查看规则是否正在读取和运行,以及简单规则是否正常工作。另外,应该注意,运行状况检查页面与负载平衡器配合良好。有人知道为什么这个在IIS 8.5中不起作用吗?我很难让它起作用。我最终发现负载平衡器上只有443端口的侦听器,没有80端口。我想这看起来很明显,但给它一个建议,看看你是否有问题,让这个工作。解决方案不太适合我。正如Matt Houser所建议的,查询字符串参数是重复的。不幸的是,如果从重定向url中删除
    {REQUEST\u URI}
    ,则在重定向时查询字符串参数将完全丢失。为了让它正常工作,我在IIS中取消了“追加查询字符串”复选框。操作变为
    控制器或操作上是否有
    RequireHttps
    属性,如果有,则不应该有。这需要通过HTTP执行与后端实例的所有通信。ELB成为SSL/HTTPS的最终确定点。啊,好吧,我知道它现在在做什么。是的,这就是问题所在,去掉那个过滤器就解决了。非常感谢。我必须在IIS管理器中创建此规则,然后返回并手动编辑配置以正常工作。“条件”部分被设置为“匹配任何条件”,因为“匹配所有条件”不起作用。还必须在IIS中取消勾选“追加查询字符串”。我正在尝试使用您的代码@Luke将Google Analytics连接到我的网站,但是它无法连接,因为唯一允许的流量是HTTPS。您建议如何解决此问题?