2010-04-09 59 views
21

我正在使用IIS 7的URL重写功能来执行从example.com到www.example.com的永久重定向,并将类似域名重写为“主要”域名,例如www.examples.com到www.example.com。IIS7 URL重写:如何不从重写的URL中删除HTTPS协议?

此重写规则 - 如下所示 - 现在运行良好。但是,我们最近添加了HTTPS支持,并注意到如果用户访问其中一个URL以重写为www.example.com,则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> 

正如你所看到的,动作元素的URL直接属性点到http://,所以我知道为什么https://example.com被重定向到http://www.example.com。我的问题是,我该如何解决这个问题?我尝试过(天真地)从url属性中删除http://部分,但那不起作用。

+0

看来,只是留下'HTTP跨域解决方案://'出来的重定向URL将导致IIS 7.5使用入站请求的协议。 – HABO 2012-09-12 15:13:47

回答

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

我相信你的意思是让那些说“MatchAll”而不是“MatchAny”。否则,你会陷入死循环,页面停止加载。 – 2012-04-19 11:45:56

+0

第一条规则的含义是“如果HTTPS模式关闭***并且*** HTTP_HOST网址看起来像这种模式”。第二条规则的意思是“如果HTTPS模式关闭***并且*** HTTP_HOST网址看起来像这种模式”。 – 2012-04-19 11:54:16

+0

@斯科特Mitchel你会请写一些解释too..for模式中使用的符号? – 2016-02-18 08:31:03

6

如果你只是想根据当前使用的协议重定向(根据你的最后一个样本),那么有一个更简单的解决方案,将减少你需要的规则数量。以下是我从我的一个同事那里学到的。

正如您所见,{HTTPS}参数将包含值ON或OFF。您可以将此值映射到https://或http://,通过将此值提供给rewritemap。

这里是如何做到这一点的工作:

1-用于映射{HTTPS}值创建RewriteMap指令部分:

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

它是由你来决定,如果你想只包括协议,或者分号和正斜杠。解决方案无关紧要,但请记住,无论您提及哪种解决方案。请参考这张地图,无论你需要什么。在此示例它在出站规则中使用,但它也将在你们的场景:这取决于如果你在

<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。

希望这会有所帮助!

+0

这肯定会提高史考特的答案。我将做出第三个回复,将你的两个答案结合起来,以显示配置应该是什么样子。 – 2012-04-19 12:15:19

36

这是斯科特对Hasan改进的回答。这应该涵盖混合的SSL /非SSL网站。规则基本上说“如果url没有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> 
+0

我假设'rewriteMap'应该有'defaultValue =“http://”',而不是'“OFF”'。 – Douglas 2014-02-09 12:59:29

+0

@Douglas ['defaultValue'](https://www.iis.net/learn/extensions/url-rewrite-module/using-rewrite-maps-in-url-rewrite-module)属性指定默认输入参数,而不是返回值。在这种情况下,如果没有传递,“OFF”是默认值。 – rdev5 2016-03-16 20:49:15

+0

@MattBorja:你确定吗?如果传入的URL没有在映射中定义,那么'defaultValue'属性指定使用什么值,在这种情况下,将返回一个空字符串。“ – Douglas 2016-03-16 21:01:47

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>