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

Iis 7 IIS7 URL重写:如何不从重写的URL中删除HTTPS协议?,iis-7,url-rewriting,Iis 7,Url Rewriting,我在一个网站上工作,该网站使用IIS 7的URL重写功能从example.com永久重定向到www.example.com,以及从类似域名重写到“主”域名,例如从www.examples.com到www.example.com 这个重写规则(如下所示)已经运行了一段时间。但是,我们最近添加了HTTPS支持,并注意到如果用户访问要重写到www.example.com的URL之一,则HTTPS将被删除。例如,如果用户访问,他们会被重定向到,而我们希望他们被发送到 以下是感兴趣的重写规则(在Web.c

我在一个网站上工作,该网站使用IIS 7的URL重写功能从example.com永久重定向到www.example.com,以及从类似域名重写到“主”域名,例如从www.examples.com到www.example.com

这个重写规则(如下所示)已经运行了一段时间。但是,我们最近添加了HTTPS支持,并注意到如果用户访问要重写到www.example.com的URL之一,则HTTPS将被删除。例如,如果用户访问,他们会被重定向到,而我们希望他们被发送到

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



被重定向到。我的问题是,如何解决这个问题?我(天真地)尝试从url属性中删除http://部分,但没有成功。

在同事的帮助下找到了答案

我需要在{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>


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

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

如您所见,{HTTPS}参数将包含ON或OFF值。通过将此值输入到重写映射中,可以将此值映射到https://或http://中

这将如何工作:

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

    <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重写模块现在应该自动为链接使用正确的协议,这取决于您使用的是https,当然是http


希望这有帮助

下面是斯科特对哈桑改进的回答。这应该涵盖混合的SSL/非SSL站点。规则基本上是说“如果url没有www.example.com”,则永久重定向到它。基本上。。。您正在将不使用www或直接访问您的IP地址的人重定向到您的IP地址


这是一个跨域解决方案,它不仅适用于
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>


我相信你的意思是让那些人说“MatchAll”而不是“MatchAny”。否则你会陷入死亡循环,页面停止加载。第一条规则应该是“如果HTTPS模式关闭,HTTP_主机url看起来像这个模式”。第二条规则的意思应该是“如果HTTPS模式关闭,HTTP_主机url看起来像此模式”。@Scott Mitchel请您也写一些解释。对于模式中使用的符号,这肯定会改进Scotts的答案。我将结合您的两个答案做出第三个答复,以显示配置应该是什么样子。似乎只要将
HTTP://
从重定向URL中删除,IIS 7.5就会使用入站请求的协议。@Douglas该属性指定默认的输入参数,而不是返回值。在这种情况下,如果没有传递,则默认值为“OFF”。@MattBorja:确定吗
“如果传入URL未在映射中定义,则
defaultValue
属性指定要使用的值。在这种情况下,将返回一个空字符串。”刚做了一个确认测试,它看起来像是默认返回值,而不是我最初认为的输入参数。因此,在答案中,如果出于任何原因,{HTTPS}serverVariable返回除ON或OFF之外的任何内容(您可能永远不会看到这种情况发生……meh),它将写出OFFwww.example.com