繁体   English   中英

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

[英]http to https rewrite too many redirect loops IIS 7

我有我在 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 可能会解决问题。 如果没有,则可能是服务器配置问题,而不是您的计算机问题。 以下是一些建议: 稍后重新加载此网页。 了解有关此问题的更多信息。

输入以下输入条件:

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

代替:

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

我们将 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>

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

<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>

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

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

对于 IIS 10(Windows Server 2016),我遵循了此处的说明,为重写生成了略有不同的 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 ,匹配仅*

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

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

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

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

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

经过数小时的研究和测试,我推断出它与此处描述的问题类似,总结如下:

为了降低成本,[许多托管服务提供商在 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>

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

原始liquidweb 帮助文章

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

在此处输入图片说明

确保将模式更改为完整。

我想出了一些关于这个问题的东西。 基本上,如果传入请求是 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>

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

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

数字

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM