IIS配置HTTPS跳转与域名重定向规则方法

nZone 2023年11月18日更新于12 月前 共1330字 42行代码 预计7分钟 评论 358

本文详细解释了在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的。

当然,如果旧站没有做解析,是不会跳转的,而且通常这在解析层面就做好了。

域名301跳转到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),之后的规则将不再应用。

weinxin
公众号
闹着玩下网
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: