尽管正则表达式有效,但规则在重写规则中不起作用

Rule not working in rewrite rules despite valid regex

我们的 webconfig 文件使用 Url 重写,本质上是将任何 http 流量推送到 https

除了在本地开发外,这工作得很好。有一段时间我们必须简单地记住从 web.config 中注释掉代码并再次取消注释以进行提交。这自然不是一个好的工作方式。

代码简单

<rewrite>
  <rules>
    <rule name="Redirect-AllWWW-ToSecureNonWWW">
      <match url="^((?!local).)*$" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^(?:www\.)(.+)$" />
      </conditions>
      <action type="Redirect" url="https://{C:1}/{R:0}"/>
    </rule>
    <rule name="Redirect-AllNonSecure-ToSecureNonWWW-ExcludingLocalhost">
      <match url="^((?!local).)*$" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^localhost$" negate="true" />
        <add input="{HTTPS}" pattern="^off$" />
        <add input="{HTTP_HOST}" pattern="^(?:www\.)?(.+)" />
      </conditions>
      <action type="Redirect" url="https://{C:1}/{R:0}" />
    </rule>
  </rules>
</rewrite>

根据 regex101 ,它有效! https://regex101.com/r/3Mz6w1/1

然而,当在本地主机上时,我仍然被定向到 HTTPS

为什么它在 regex101 中有效,而在我的 web.config 文件中无效

这似乎与Redirect rule not working

有关

quote from URL Rewrite Module Configuration Reference

A rewrite rule pattern is used to specify a pattern to which the current URL path is compared.

...

A pattern is specified within a <match> element of a rewrite rule.

根据这条官方信息,你必须确定 <match url 仅与 URL paths 进行比较,其中不包含主机名不是整个URL

对于Url Rewrite Module,例如URL本题路径为questions/44944175/rule-not-working-in-rewrite-rules-despite-valid-regex。否 whosebug.comhttps:// 没有查询字符串,只有没有前导斜线的路径。

要忽略对包含 local 的主机名的请求,您需要一些条件来寻找 localHTTP_HOST header.

的匹配项
<rewrite>
    <rules>
        <rule name="Redirect-AllWWW-ToSecureNonWWW" stopProcessing="true">
            <match url=".*" />
            <conditions>
                <!-- continue if http host name does not contain "local" -->
                <add input="{HTTP_HOST}" pattern="local" negate="true" />

                <add input="{HTTP_HOST}" pattern="^(?:www\.)(.+)$" />
            </conditions>
            <action type="Redirect" url="https://{C:1}/{R:0}" />
        </rule>
        <rule name="Redirect-AllNonSecure-ToSecureNonWWW-ExcludingLocalhost" stopProcessing="true">
            <match url=".*" />
            <conditions>
                <!-- continue if http host name does not contain "local" -->
                <add input="{HTTP_HOST}" pattern="local" negate="true" />

                <add input="{HTTPS}" pattern="^off$" />
                <add input="{HTTP_HOST}" pattern="^(?:www\.)?(.+)" />
            </conditions>
            <action type="Redirect" url="https://{C:1}/{R:0}" />
        </rule>
    </rules>
</rewrite>