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 的结果,如下所示:<add input="HTTP_X_FORWARDED_PROTO" pattern="^http$" ignoreCase="false" />
。
来自 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以将HTTPS重定向到HTTP会导致null HttpContext.Request.ContentType