IIS 重写规则 - 忽略本地主机

IIS Rewrite rule - ignore for localhost

我有以下规则,可以很好地将我的 www 请求重定向到根目录。

但是我似乎无法为本地主机关闭它。这是我现在拥有的:

    <rule name="CanonicalHostNameRule1">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^example\.com$" negate="true" />
      </conditions>
      <action type="Redirect" url="https://example.com/{R:1}" />
    </rule>

我尝试了很多东西,包括:

    <rule name="CanonicalHostNameRule1">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^localhost$" negate="true" />
        <add input="{HTTP_HOST}" pattern="^example\.com$" negate="true" />
      </conditions>
      <action type="Redirect" url="https://example.com/{R:1}" />
    </rule>

你能帮忙吗?正则表达式是我的弱点唉

如何使用条件仅匹配以 www. 开头的请求,而不是在您不想应用规则时尝试否定?这避免了否定 localhost 的需要,因为 localhost 在条件中永远不匹配:

<rule name="Strip WWW" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{HTTP_HOST}" pattern="^www\.(.*)" />
    </conditions>
    <action type="Redirect" url="https://{C:1}/{URL}" />
</rule>

但是,您尝试的规则示例(您的第二个代码块)也适用于我在 Windows 10 VM 上使用 IIS 进行测试。我可以浏览到 localhost 而无需重定向。也许这里还有另一个问题。

我不会混合不同托管环境的规则; localhost(用于本地开发)和 www,您的实时环境。 如果将它们分开,则不必根据环境启用和禁用规则。

rules 部分有一个 configSource 属性,您可以通过它指向另一个单独的文件,例如。 RewriteRules.config。 这样做,web.config 将如下所示。

<configuration>
    <!-- Other settings go here. -->

    <system.webServer>
        <!-- other settings go here --->

        <rewrite>
            <rules configSource="RewriteRules.config">
        </rewrite>
    </system.webServer>   
</configuration>

RewriteRules.config 文件包含规则。

<rules>
    <rule name="CanonicalHostNameRule1">
        <!-- Rule details go here -->
    </rule>
</rules>

您为每个环境制作此 RewriteRules.config 文件的单独版本,仅包含适当的规则并将其部署到相关的网络服务器。

这有很多好处。

  • 只评估相关环境的规则,这对性能更好。
  • 如果您有其他环境,例如 QA (http://qa. ...) and dev (http://dev. ...),它会更灵活。
  • 您不必担心(和测试)一个环境的规则是否会干扰另一个环境的规则,这里:本地 vs 现场。

RewriteRules.config 文件的部署可以包含在部署自动化中。