[英]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 请求。
.
最终,我与 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>
我希望这可能适用于处于类似情况的其他人。
我想出了一些关于这个问题的东西。 基本上,如果传入请求是 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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.