IIS7 URL重写:如何不从重写的URL中删除HTTPS协议?

时间:2010-04-09 16:08:51

标签: iis-7 url-rewriting

我正在使用IIS 7的网址重写功能的网站进行从example.com到www.example.com的永久重定向,以及从类似域名重写到“主要”域名,例如从www.examples.com到www.example.com。

这个重写规则 - 如下所示 - 已经有一段时间了。但是,我们最近添加了HTTPS支持,并注意到如果用户访问要重写到www.example.com的其中一个URL,则会删除HTTPS。例如,如果用户访问https://example.com,则会将其重定向到http://www.example.com,而我们希望将其发送到https://www.example.com

以下是感兴趣的重写规则(在Web.config中):

<rule name="Canonical Host Name" stopProcessing="true">
    <match url="(.*)" />

    <conditions logicalGrouping="MatchAny">
        <add input="{HTTP_HOST}" pattern="^example\.com$" />
        <add input="{HTTP_HOST}" pattern="^(www\.)?example\.net$" />
        <add input="{HTTP_HOST}" pattern="^(www\.)?example\.info$" />
        <add input="{HTTP_HOST}" pattern="^(www\.)?examples\.com$" />
    </conditions>

    <action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
</rule>

如您所见,action元素的url属性直接指向http://,因此我明白为什么https://example.com被重定向到http://www.example.com。我的问题是,我该如何解决这个问题?我试图(天真地)从url属性中删除http://部分,但这不起作用。

4 个答案:

答案 0 :(得分:40)

这是Scott对Hasan改进的回答。这应该涵盖混合的SSL /非SSL站点。该规则基本上表示“如果网址没有www.example.com”,请执行永久重定向。基本上......你正在重定向那些没有www或直接访问你的IP地址的人。

<rewrite>
<rules>
    <rule name="Canonical Host Name" stopProcessing="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAll">
            <add input="{HTTP_HOST}" pattern="^www\.example\.com$" negate="true" />
        </conditions>
        <action type="Redirect" url="{MapSSL:{HTTPS}}www.example.com/{R:1}" redirectType="Permanent" />
    </rule>
</rules>
<rewriteMaps>
    <rewriteMap name="MapSSL" defaultValue="http://">
        <add key="ON" value="https://" />
        <add key="OFF" value="http://" />
    </rewriteMap>
</rewriteMaps>
</rewrite>

答案 1 :(得分:10)

在同事的帮助下找出答案。

我需要在{HTTPS}上使用带有条件的多个规则。请注意以下规则中的{HTTPS}条件。

<rule name="Canonical Host Name (HTTP)" stopProcessing="true">
    <match url="(.*)" />

    <conditions logicalGrouping="MatchAny">
        <add input="{HTTPS}" pattern="OFF" />
        <add input="{HTTP_HOST}" pattern="^example\.com$" />
    </conditions>

    <action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
</rule>

<rule name="Canonical Host Name (HTTPS)" stopProcessing="true">
    <match url="(.*)" />

    <conditions logicalGrouping="MatchAny">
        <add input="{HTTPS}" pattern="ON" />
        <add input="{HTTP_HOST}" pattern="^example\.com$" />
    </conditions>

    <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" />
</rule>

然后,我重复了上面的规则对,以获取备用域名。

答案 2 :(得分:7)

如果您只想根据当前使用的协议进行重定向(根据您的上一个示例),那么有一个更简单的解决方案可以将您需要的规则数量减半。以下是我从我的同事那里学到的东西。

如您所见,{HTTPS}参数将包含值ON或OFF。您可以将此值映射到https://或http://,方法是将此值提供给重写映射。

这是如何工作的:

1-创建一个rewritemap部分,用于映射{HTTPS}值:

    <rewriteMap name="MapProtocol" defaultValue="OFF">
      <add key="ON" value="https://" />
      <add key="OFF" value="http://" />
    </rewriteMap>

由您决定是否只包含协议,或分号和正斜杠。这对解决方案无关紧要,但无论您何时提及它,请记住它。

2-无论您需要什么,请参阅此地图。在此示例中,它用于出站规则,但它也适用于您的场景:

    <rule name="Outbound-Rule Name" stopProcessing="true" preCondition="ResponseIsHtml">
      <match filterByTags="A, Link, Script" pattern="YOUR PATTERN" />
      <action type="Rewrite" value="{MapProtocol:{HTTPS}}{HTTP_HOST}/REST OF RELATIVE LINK HERE" />
    </rule>

就是这样,URL Rewrite模块现在应该自动使用正确的链接协议,具体取决于您使用的是https,当然还有http。

希望这有帮助!

答案 3 :(得分:1)

这是一个跨域解决方案,不仅适用于example.com,也适用于任何域

<rewrite>
    <rules>
        <rule name="Canonical Host Name" stopProcessing="true">
            <match url="(.*)" />
            <conditions logicalGrouping="MatchAll">
                <add input="{HTTP_HOST}" pattern="^www\.([.a-zA-Z0-9]+)$" negate="true" />
            </conditions>
            <action type="Redirect" url="{MapProtocol:{HTTPS}}www.{HTTP_HOST}/{R:0}" redirectType="Permanent" />
        </rule>
    </rules>
    <rewriteMaps>
        <rewriteMap name="MapProtocol" defaultValue="OFF">
            <add key="ON" value="https://" />
            <add key="OFF" value="http://" />
        </rewriteMap>
    </rewriteMaps>
</rewrite>