【问题标题】:http to https rewrite too many redirect loops IIS 7http到https重写太多重定向循环IIS 7
【发布时间】:2015-12-08 00:27:42
【问题描述】:

我有在 IIS 7.0 中托管的应用程序。 我必须确保它仅适用于 HTTPS 而不是 HTTP 所以我在我的根配置中包含了以下规则。

<rewrite>
        <rules>
            <rule name="HTTP to HTTPS redirect" stopProcessing="true">
              <match url="(.*)" />
              <conditions>
                <add input="{HTTPS}" pattern="off" />
              </conditions>
              <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}"   redirectType="Found" />
            </rule>
        </rules>
</rewrite> 

当我尝试访问我的应用程序时添加此规则后,出现以下错误:

页面导致了过多的重定向。清除您的 cookie 本网站或允许第三方 cookie 可能会解决此问题。如果不, 这可能是服务器配置问题,而不是问题 你的电脑。以下是一些建议: 稍后重新加载此网页。 详细了解此问题。

【问题讨论】:

    标签: asp.net asp.net-mvc loops iis url-rewriting


    【解决方案1】:

    如果您将 cloudflare 用于 SSL,请将其设置为完整模式

    Cloudflare -> SSL/TLS -> 概述 -> 完整

    Figure

    【讨论】:

      【解决方案2】:

      我对这个问题有所了解。基本上,如果传入的请求是 HTTPS,则什么也不做。

                <rule name="No Redirect if https" enabled="true" stopProcessing="true">
                      <match url=".*" />
                      <conditions logicalGrouping="MatchAny" trackAllCaptures="false">
                          <add input="{HTTPS}" pattern="^ON$" />
                      </conditions>
                      <action type="None" />
                  </rule>
                  <rule name="Redirect to https" enabled="true" stopProcessing="true">
                      <match url="(.*)" />
                      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                          <add input="{HTTP_HOST}" pattern="^\example\.com$" />
                          <add input="{HTTPS}" pattern="^OFF$" />
                      </conditions>
                      <action type="Redirect" url="https://{HTTP_HOST}{R:0}" />
                  </rule>
      

      【讨论】:

        【解决方案3】:

        我也遇到过这个问题。对服务器的所有请求都是 HTTP。 就我而言,问题是我使用 Cloudflare DNS。 有 SSL/TLS 设置,默认情况下 SSL/TLS 加密模式设置为灵活。

        确保将模式更改为完全。

        【讨论】:

          【解决方案4】:

          我正在使用 Liquid Web Cloud 站点,但遇到了完全相同的问题。

          我在这里尝试了解决方案,但由于这种情况,它不能满足我的需要:

          <add input="{HTTPS}" pattern="off" />
          

          正如 OP 所说,这意味着,“在 HTTPS 关闭时匹配并执行此规则”。而这个问题的公认解决方案只是颠倒了这一点,并在 HTTPS 开启时匹配规则。它解决了无限循环问题,但这只是因为我的规则匹配不正确——我实际上只想在 HTTPS 关闭时将请求更改为 HTTPS。因此,我的 HTTP 请求都没有被转发。

          有趣的是,我的 HTTPS 请求也没有被转发,因此(以及我所做的其他一些测试)我确定虽然浏览器显示 HTTPS,但服务器将其视为 HTTP 请求。因此,服务器始终认为它正在接收 HTTP 请求,并且始终忽略该规则(该规则现在仅指定匹配 HTTPS 开启的请求 - 即从不)。

          经过数小时的研究和测试,我推断它与described here 类似的问题,总结如下:

          为了降低成本 [许多托管服务提供商在 TMG 网关上安装了] SSL 证书,并且此网关在将请求传递到实际 Web 服务器时只是将请求重写为标准 HTTP。因此,当请求到达 IIS 和您的 Web 应用程序时,它就是一个标准的纯 HTTP 请求。

          .

          TLDR;

          最终,我与 Liquid Web 的团队进行了交谈,他们向我指出了一篇隐藏在他们自己网站中的帮助文章的方向,该文章解决了这个问题。他们建议我使用以下重写规则来修复它:

          <system.webServer>
           <rewrite>
            <rules>
             <rule name="Redirect to HTTPS" stopProcessing="true">
               <match url=".*"/>
              <conditions>
               <add input="{HTTP_CLUSTER_HTTPS}" pattern="^on$" negate="true"/>
               <add input="{HTTP_CLUSTER_HTTPS}" pattern=".+" negate="true"/>
              </conditions>
              <action type="Redirect" url="https://{HTTP_HOST}{SCRIPT_NAME}" redirectType="SeeOther"/>
             </rule>
            </rules>
           </rewrite>
          </system.webServer>
          

          我希望这可能适用于处于类似情况的其他人。

          Original liquidweb help article

          【讨论】:

            【解决方案5】:

            对于 IIS 10 (Windows Server 2016),我遵循了来自 here 的说明,它为重写生成了稍微不同的 XML 配置:

            <rewrite>
                <rules>
                    <rule name="HTTP 2 HTTPS" patternSyntax="Wildcard" stopProcessing="true">
                        <match url="*" />
                        <conditions logicalGrouping="MatchAny">
                            <add input="{HTTPS}" pattern="off" />
                        </conditions>
                        <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Found" />
                    </rule>
                </rules>
            </rewrite>
            

            模式是off,匹配只有*

            【讨论】:

              【解决方案6】:

              我的情况,我需要这样写:

              <rewrite>
              <rules>
                  <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                    <match url="(.*)" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAny">
                      <add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" />
                      <add input="{HTTPS}" pattern="on" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}"   redirectType="Found" />
                  </rule>
              </rules>
              

              【讨论】:

              • 它有效,但为了避免斜杠,我们需要更改操作标记中的url="https://{HTTP_HOST}{R:1}" 属性。
              【解决方案7】:

              正如 SNag 所提到的,我们有一个位于亚马逊 ELB 后面的网站。尝试在没有以下输入标头的情况下应用重写规则会导致无限重定向。这似乎是需要输入类型为 HTTP_X_FORWARDED_PROTO 的结果,如下所示:&lt;add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" /&gt;

              来自 AWS 文档“您的应用程序或网站可以使用存储在 X-Forwarded-Proto 请求标头中的协议来呈现重定向到适当 URL 的响应。”我们正在使用带有 DNS 条目的 ELB 转发到上面有站点的服务器。

              【讨论】:

                【解决方案8】:

                我们的 ASP.NET 应用程序使用 Elastic Load Balancing 托管在 AWS 上,问题中带有已接受答案的规则对我们不起作用,并不断导致无限重定向。

                这是最终对我们有用的规则:

                <rewrite>
                   <rules>
                      <rule name="HTTPS Rule behind AWS Elastic Load Balancer Rule" stopProcessing="true">
                         <match url="^(.*)$" ignoreCase="false" />
                         <conditions>
                            <add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
                         </conditions>
                         <action type="Redirect" url="https://{SERVER_NAME}{URL}" redirectType="Found" />
                      </rule>
                   </rules>
                </rewrite>
                

                【讨论】:

                • 有人给这个人一个奥斯卡!你刚刚救了我的命,还了我的理智!!谢谢!!上帝保佑你!!
                • @MarcioMartins:很高兴它有帮助! :) 干杯!!
                • 你还在救命,伙计。疯了这么多小时,但你给了治疗
                • 在其他 3 个规则变体之后,这是在我的情况下真正起作用的一个!
                【解决方案9】:

                输入条件如下:

                <add input="{HTTPS}" pattern="on" /> 
                

                代替:

                <add input="{HTTPS}" pattern="off" />
                

                【讨论】:

                • 这阻止了我发生的无限重定向,但现在我的 http 根本没有重定向到我的 https。有什么想法吗?
                • 我找到了我的问题的解决方案,记录在这里:stackoverflow.com/a/56828987/2287428
                • 它也启用了http版本。
                猜你喜欢
                • 2018-01-18
                • 1970-01-01
                • 2018-07-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-06-21
                • 2015-01-08
                相关资源
                最近更新 更多