我在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>
通过这两条规则,我可以使用以下重定向工作:
答案 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>