HTTP到HTTPS重定向 - IIS 8.5无法正常工作

16

我在这里看了许多SO的帖子以及在网上(IIS博客等)阅读了一些内容。 我试图将所有从domain.com发出的连接强制重定向到www.domain.com,并同时将请求从HTTP强制重定向到HTTPS。

我正在使用这组规则和重写,但唯一发生的是它可以很好地重定向,但无法重定向到SSL。

<!-- Redirect to HTTPS -->
<rewrite>
    <rules>
        <rule name="Redirect to www" stopProcessing="true">
            <match url="(.*)" />
            <conditions trackAllCaptures="false">
                <add input="{HTTP_HOST}" matchType="Pattern" pattern="^mydomain.com$" ignoreCase="true" negate="false" />
            </conditions>
            <action type="Redirect" url="{MapProtocol:{HTTPS}}://www.mydomain.com/{R:1}" />
        </rule>
    </rules>
    <rewriteMaps>
        <rewriteMap name="MapProtocol" defaultValue="http">
          <add key="on" value="https" />
          <add key="off" value="http" />
        </rewriteMap>
    </rewriteMaps>
</rewrite>

我做错了什么?

主要参考博客: http://weblogs.asp.net/owscott/url-rewrite-protocol-http-https-in-the-action 和这篇 SO 帖子 - web.config 重定向非 www 到 www


除了配置错误之外,不要忘记在Chrome的隐身窗口中进行实验,否则您的301重定向将被缓存。每次尝试新的实验时,您需要关闭并启动一个新的隐身窗口。 - CAD bloke
4个回答

17

使用URL Rewrite模块将http重定向到https时,我们遇到了同样的问题,但在关闭IIS中的require ssl模块后,问题得以解决。

  1. 前往网站的SSL设置
  2. 取消选中“要求SSL”复选框
  3. 应用设置并重新启动IIS

这对我来说是个问题。 - Asiri Dissanayaka
这解决了问题。谢谢! - user3746480

14

对于某些情况来说,这可能有点冒险,但我已经删除了网站的80端口绑定,因为我只想要SSL/ 443端口。所以根据我的观察,80端口绑定也需要才能使重写正常工作。


1
这对我有用。我使用另一个HTTP端口2021发布了我的网站,并删除了默认的80端口绑定。将其添加回来对我有用。 - Atiq Baqi
这对我有用。我之前删除了80端口,因为我只想使用https。 - Savas Karaduman

13

编辑:我找到了这篇博客文章:http://www.meltedbutter.net/wp/?p=231,尝试了一下,哇!像魔法一样奏效。不确定为什么这个方法比上面发布的规则有效,但在我的情况下,以下方法有效,并成功地将所有非www流量重定向到wwwhttps

<!-- Redirect to HTTPS -->
        <rewrite>
            <rules>
                <rule name="http to https" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="^OFF$" />
                    </conditions>
                    <action type="Redirect" url="https://www.domain.com/{R:1}" redirectType="SeeOther" />
                </rule>
            </rules>
        </rewrite>

1
"redirectType =“seeOther”是解决方案。它毁了我的一天。" - Ghasem Pahlavan
1
这在我的三台服务器上都完全无法工作。 - Franck

3
在我的情况下,我尝试了@Valien说的所有方法以及其他很多方法,但都没有成功。最后我找到了问题所在。原因是我使用了两个规则。第一条规则是将重写到NodeJs服务器,第二条是将http重定向到https。我改变了顺序,现在它正常工作了。
如果应用超过1条规则,则使用以下正确顺序的配置:
<rewrite>
     <rules>
           <rule name="http to https" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="^OFF$" />
                    </conditions>
                    <action type="Redirect" url="https://mywebsite.com/{R:1}" redirectType="SeeOther" />
           </rule>
           <rule name="ReverseProxyToLocalhost:3000" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://localhost:3000/{R:1}" />
           </rule>
      </rules>
 </rewrite>

我已经为此苦恼了好几天,谁能想到规则的顺序如此重要。非常感谢!!! [+1] - kapitan
See Other 对我起作用了。 - cdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接