IIS HTTP 到 HTTPS 的相对重定向
Posted
技术标签:
【中文标题】IIS HTTP 到 HTTPS 的相对重定向【英文标题】:IIS HTTP to HTTPS relative redirect 【发布时间】:2013-03-23 07:32:35 【问题描述】:我最近为我的网站获得了 SSL 证书,并希望将所有流量重定向到 HTTPS。我把所有东西都转到https://mydomain.com
,但如果有人输入http://mydomain.com/anotherpage
,它会丢弃另一个页面,只是将用户带到主页。
我在web.config
文件中的规则如下所示:
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="HTTPS" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://HTTP_HOST/R:1" />
</rule>
我也试过https://HTTP_HOSTREQUEST_URI
,但没有成功。谁能告诉我我需要做什么才能使网站重定向到页面的正确 HTTPS 版本?我感觉它与模式有关,但我似乎无法弄清楚语法。
【问题讨论】:
我认为这与反向引用有关。如果您将模式更改为url=".*"
并重写为url="https://HTTP_HOST/R:0"
怎么办?
这仍然会将所有内容重定向回主页。
这真的很奇怪。您将不得不使用the failed request tracing 工具来查看问题出在哪里。
【参考方案1】:
改成:
<rewrite>
<rules>
<rule name="Redirect to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="HTTPS" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://HTTP_HOST/R:1" />
</rule>
</rules>
</rewrite>
【讨论】:
这里的关键变化是什么?pattern="^OFF$"
?【参考方案2】:
我找到了一种方法来做到这一点,你不需要重写模块。以下在 Windows 8 (IIS 8.5) 上对我有用:
-
从您的站点中删除 HTTP 绑定(保留 HTTPS)
添加其他网站
确保新站点具有 HTTP 绑定
如图所示配置 HTTP 重定向:
现在所有 HTTP 请求都将重定向到您的 HTTPS 站点,并将保留 URL 的其余部分。
【讨论】:
太棒了!还能够绑定IP地址以重定向到https!谢谢!【参考方案3】:我相信 AndyH 的回答是最简单和最好的方法。我发现使用 URL 重写也可能与可能将用户重定向到另一个页面的代码冲突。 IT 经常在我们的环境中崩溃。但安迪的解决方案完美无缺。我还认为 Andy 的解决方案将减少服务器的开销,因为它不需要检查每个 url 命中它的可能的重写条件。
【讨论】:
【参考方案4】:我还不能发表评论,否则我会在 AndyH 的回答下将此作为评论。解决方案是正确的,尽管我遇到了一个进一步的障碍(可能与使用 Adobe 的 Coldfusion 服务器有关)。我想分享一些我必须为其他可能遇到它的不幸灵魂做的进一步研究。
一旦设置,重定向将始终在此 url 结束:
https://xxx.xxx.com/jakarta/isapi_redirect.dll
在 Adobe 线程 (https://forums.adobe.com/thread/1034854) 中找到了解决此问题的方法:我必须更改应用程序池的设置,如下所示:
真实站点(仅 HTTPS 绑定,实际上包含代码和虚拟目录)
应用程序池的高级设置:Enable 32-Bit Applications : False
Http_Redirect 站点(仅 HTTP 绑定,是没有目录的文件夹的空白外壳)
应用程序池的高级设置:Enable 32-Bit Applications : True
编辑:另一个细节,与查询字符串保存有关:
根据这篇文章中的建议 (http://www.developerfusion.com/code/4678/permanent-301-redirect-with-querystring-in-iis/)
在域末尾添加$S$Q
,并确保选中Redirect all requests to exact destination
框。然后它也会保存查询字符串。
【讨论】:
【参考方案5】:R:1
删除我的文件夹时遇到了同样的问题。
我是这样修的。
<rule name="http to https" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="HTTPS" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://HTTP_HOSTREQUEST_URI"
appendQueryString="false" redirectType="SeeOther" />
</rule>
【讨论】:
【参考方案6】:我找到了解决方法:
考虑一下 IIS 中的网站是什么:只是一组规则、获取文件的路径及其绑定。
此外,还有一个名为“HTTP Redirect”的函数(标准包含在 IIS 中),它将一个主机重定向到另一个主机,保留所有子目录(它创建一个相对路径)。解决方法是在您的网站中仅保留 HTTPS(端口 443)的绑定,并使用 HTTP(端口 80)上的绑定创建另一个绑定,并为此设置一个 HTTP 重定向到您的 URL,使用 https://
。
例如,考虑一个名为mytest
的网站及其网址http://www.mytest.com/
和https://www.mytest.com/
。
设置它而不是仅绑定https://www.mytest.com/
,并删除http
绑定。然后创建一个具有相同本地路径的新网站,名为 mytest http
,仅绑定端口 80 (http://www.mytest.com/
),并为此设置一个 HTTP Redirect
到 https://www.mytest.com/
。
简单而干净,这应该与用户直接访问 https url 一样快,因为它只是一个内部重定向。我希望这对你有用!
【讨论】:
【参考方案7】:您可以将 URL 重写模块添加到 IIS(IIS 7 或更高版本),它允许您以可视方式添加创建重定向。模块可以在here下载。
这个step-by-step tutorial 为我创造了奇迹,并解释说在使用这个模块时,它实际上所做的只是将一些代码添加到您的web.config
文件中:
<rewrite>
<rules>
<rule name="Redirect to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="HTTPS" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://HTTP_HOST/R:1" redirectType="SeeOther" />
</rule>
</rules>
</rewrite>
【讨论】:
【参考方案8】:我发现
<action type="Redirect" redirectType="Found" url="https://HTTP_HOST/R:1" />
语法仅适用于网站的 ROOT web.config 文件。
如果重写规则应用于虚拟 web.config 文件,则使用..
<action type="Redirect" redirectType="Found" url="https://HTTP_HOSTURL" />
URL 语法将包括初始正斜杠、虚拟路径和任何 URL 参数。
【讨论】:
以上是关于IIS HTTP 到 HTTPS 的相对重定向的主要内容,如果未能解决你的问题,请参考以下文章