IIS 重定向到 HTTPS,不同的规则相同的结果

IIS redirection to HTTPS, different rules same result

在尝试将 http 流量重定向到 https 时,我发现了以下两个规则,它们似乎在做同样的事情,但是它们在两个地方有细微的差别。我应该更喜欢那个吗?有什么好处吗? (性能、极端情况等)

规则 1:

<rule name="HTTP to HTTPS Redirect" enabled="true" stopProcessing="true">
    <match url="(.*)" />
    <conditions logicalGrouping="MatchAny">
        <add input="{SERVER_PORT_SECURE}" pattern="^0$" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" />
</rule>

规则 2:

<rule name="HTTP to HTTPS Redirect" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
        redirectType="Permanent" />
</rule>

区别在于输入和重定向 url,其中一个使用 {R:1},另一个使用 REQUEST_URI。

提前致谢

两条规则给出相同的结果。并且它们之间的性能没有显着差异。此外,IIS 默认在内核级别缓存此类规则。这意味着请求很可能会从 HTTP 内核模式驱动程序得到响应,而不会到达 Web 应用程序。因此,这些规则将以您无法衡量差异的速度发挥作用。

但是,如果您想进行不必要的优化(就像我有时做的那样:$),请检查以下规则。

<rule name="HTTP to HTTPS Redirect" patternSyntax="Wildcard" stopProcessing="true">
    <match url="*" />
    <conditions>
        <add input="{SERVER_PORT_SECURE}" pattern="0" ignoreCase="false" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" />
</rule>

以下是此规则的不必要预期改进;

  • 通配符匹配比正则表达式便宜。
  • 区分大小写a.k.a。二进制比较(ignoreCase="false")更便宜。
  • 寻找 0 寻找 {SERVER_PORT_SECURE} 比寻找 off 寻找 {HTTPS} 便宜。