IIS URL重写:强制规范主机名& HTTP到HTTPS重定向

时间:2012-02-02 11:46:05

标签: asp.net iis

我在web.config文件中使用这两个规则:

<rule name="Enforce canonical hostname" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTP_HOST}" negate="true" pattern="^www\.example\.com$" />
      </conditions>
      <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" />
    </rule>
    <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>

通过这两条规则,我可以使用以下重定向工作:

  1. http://www.example.com ---&gt; https://www.example.com
  2. http://example.com---&gt; https://www.example.com
  3. https://example.com ---&gt;这无法重定向到https://www.example.com ...为什么?

2 个答案:

答案 0 :(得分:24)

不确定你是否还在寻求答案,但现在就去了。经过一些搜索和反复试验后,我发现了以下规则的成功。我遇到的大多数示例在模式匹配方面都不必要地复杂,并引入了阻止规则按预期工作的其他变量。以下规则可以应用于任何网站,没有任何硬编码,因此它应该始终是一个直接的复制粘贴工作:

<rule name="Redirect to WWW" stopProcessing="true" >
    <match url="(.*)" />
    <conditions>
        <add input="{HTTP_HOST}" pattern="^www\." negate="true"/>
    </conditions>
    <action type="Redirect" url="https://www.{HTTP_HOST}{HTTP_URL}" redirectType="Permanent" appendQueryString="false" />
</rule>
<rule name="Redirect to HTTPS">
    <match url="(.*)" />
    <conditions>
        <add input="{HTTPS}" pattern="OFF"/>
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}{HTTP_URL}" redirectType="Permanent" appendQueryString="false" />
</rule>

需要注意的两件事:redirectType =“Permanent”将导致规则被应用,直到浏览器的历史记录/缓存被清空为止;这应该是一件好事,因为浏览器将继续进行工作。此外,appendQueryString =“false”是必要的,因为{HTTP_URL}服务器变量已经包含完整的查询字符串;默认情况下,该选项为“true”,这将导致重复的查询字符串。

答案 1 :(得分:6)

如果它对任何人都有好处,那么只有一条规则可以获得相同的东西:

<rule name="Redirect HTTP to HTTPS and non-WWW to WWW" stopProcessing="true">
    <match url="(.*)"/>
    <conditions trackAllCaptures="false" logicalGrouping="MatchAny"> <!-- match non-HTTPS or non-WWW -->
        <add input="{HTTPS}" pattern="^OFF$"/> <!-- if connection not secure -->
        <add input="{HTTP_HOST}" matchType="Pattern" ignoreCase="true" pattern="^example\.com$" /><!-- domain is not canonical  -->
    </conditions>
    <action type="Redirect" url="https://www.example.com{HTTP_URL}" redirectType="Permanent" appendQueryString="false"/>
</rule>