http到https重写太多重定向循环IIS 7

Posted

技术标签:

【中文标题】http到https重写太多重定向循环IIS 7【英文标题】:http to https rewrite too many redirect loops 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_HOSTREQUEST_URI"   redirectType="Found" />
            </rule>
        </rules>
</rewrite> 

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

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

【问题讨论】:

【参考方案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_HOSTR: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_HOSTSCRIPT_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_HOSTREQUEST_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_HOSTREQUEST_URI"   redirectType="Found" />
    </rule>
</rules>

【讨论】:

它有效,但为了避免斜杠,我们需要更改操作标记中的url="https://HTTP_HOSTR: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_NAMEURL" redirectType="Found" />
      </rule>
   </rules>
</rewrite>

【讨论】:

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

输入条件如下:

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

代替:

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

【讨论】:

这阻止了我发生的无限重定向,但现在我的 http 根本没有重定向到我的 https。有什么想法吗? 我找到了我的问题的解决方案,记录在这里:***.com/a/56828987/2287428 它也启用了http版本。

以上是关于http到https重写太多重定向循环IIS 7的主要内容,如果未能解决你的问题,请参考以下文章

尝试将 HTTP 重定向到 HTTPS(C#、IIS),但 HTTPS 在响应标头中转回 HTTP - 重定向循环

IIS 7如何实现http重定向https

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

从 HTTP 重定向到 HTTPS - IIS 7.5

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

IIS 7.5 HTTP 到 HTTPS 重定向