本文详细解释了在IIS服务器上配置http到https的跳转规则和域名重定向的步骤。包括修改规则、设置条件以及合并规则等方面的操作。最后分享了实际测试经验,解决可能出现的问题,为读者提供了实用的方法指南。
http跳转到https的规则
闹着玩下网在2021年升级为https并自动跳转了,不过那时没有记录规则写法,现在是做个分享。如果你是Apache服务器,得改“.htaccess”文件,因为我是用IIS服务器,是改“web.config”文件,并以此为例:
<rule name="Force HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" />
</rule>
再改成不做域名判断,如果希望增加规则匹配的灵活性和容错性,始终是不区分大小写可以加上:ignoreCase="true",区分就改成“false”,完整如下:
<system.webServer>
<rewrite>
<rules>
<rule name="HTTPS Redirect" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" url="https://www.nzonex.com{REQUEST_URI}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
这样就实现 http 301跳转到 https 了。
{REQUEST_URI}和{R:1}写法区别
在 IIS URL 重写规则中用于引用请求 URL 的方式有两种:{REQUEST_URI}
和 {R:1}
。
{REQUEST_URI} 是一个服务器变量,代表完整的请求路径,包括主机名、路径和查询参数。它可以在规则中直接使用,而不需要进行正则表达式匹配。在某些情况下,可能更直观和方便,因为它直接代表了整个请求路径。
另一个写法是用 {R:1},这是一个反向引用变量,用于引用规则的正则表达式中的第一个捕获组。如果你的正则表达式有多个捕获组,你可以使用 {R:1}、{R:2} 等来引用不同的捕获组内容。在单个规则的上下文中,可以用于将特定的匹配部分包含在重定向的 URL 中。
<action type="Redirect" url="https://www.nzonex.com/{R:1}" redirectType="Permanent" />
域名301跳转到www主站规则
对于域名跳转到www,有两种写法,第一种:
<add input="{HTTP_HOST}" pattern="^www\.nzonex\.com$" negate="true" />
在IIS的URL重写规则中,negate="true"
是一个条件的设置,用于指定是否对条件的结果取反。
这里使用了 negate="true",表示如果 HTTP 请求的主机名(HTTP_HOST)不匹配 www.nzonex.com 这个正则表达式,条件就会被满足。换句话说,只有当主机名不是以 www.nzonex.com 开头时,这个条件才会成立。适合只有www这个主站,如果输错比如旧站是:zero.nzonex.com,则也会跳转到www的。
当然,如果旧站没有做解析,是不会跳转的,而且通常这在解析层面就做好了。
第二种写法:
<add input="{HTTP_HOST}" pattern="^nzonex\.com$" />
这个条件没有使用 negate,表示如果 HTTP 请求的主机名匹配 nzonex.com 这个正则表达式,条件就会被满足。换句话说,只有当主机名是以 nzonex.com 开头时,这个条件才会成立。
第一个条件用于排除以 www.nzonex.com 开头的主机名,第二个条件用于匹配以 nzonex.com 开头的主机名。根据你的需求,你可以选择其中一个来进行域名重定向的逻辑。
两个规则合并
Windows系统 IIS 服务器默认情况下是不区分文件路径的大小写,在大多数情况下,不写也不会对规则的效果产生显著影响,也可以删了ignoreCase,然后加上永久重定向,最后两个合并。
第一种写法:
<rule name="Force HTTPS and nowww Redirect" stopProcessing="false">
<match url=".*" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_HOST}" pattern="^www\.nzonex\.com$" negate="true" />
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://www.nzonex.com{REQUEST_URI}" redirectType="Permanent" />
</rule>
第二种写法:
<rule name="Force HTTPS and Domain Redirect" stopProcessing="false">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_HOST}" pattern="^nzonex\.com$" />
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" url="https://www.nzonex.com{REQUEST_URI}" redirectType="Permanent" />
</rule>
服务器上配置是不会有双斜杠的问题,如果要在隐性URL解析情况下,解决双斜杠问题,只能做二次跳转,就是那篇文章开头的第一段的“RemoveDoubleSlashes"代码。
在处理多个规则时,IIS Rewrite 模块会按照规则的顺序逐一检查并应用,当匹配到满足条件的规则时,会按照该规则的操作进行处理,如果加上stopProcessing="true"(不加默认是false),之后的规则将不再应用。