Правило перезаписи IIS - игнорировать для localhost

У меня есть следующее правило, которое хорошо работает для перенаправления моих www-запросов на root.

Однако я не могу отключить его для локального хоста. Вот что у меня есть сейчас:

    <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>

Не могли бы вы помочь? Regexes - моя слабость увы

Ответ 1

Как насчет того, чтобы использовать условие только для соответствия запросам, начинающимся с 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>

Однако ваш пример правила, который вы пробовали (ваш второй блок кода), также работает для меня при тестировании с помощью IIS на виртуальной машине Windows 10. Я могу перейти на localhost без перенаправления. Возможно, здесь есть и другая проблема.

Ответ 2

Я бы не смешивал правила разных хостинговых сред; 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>

Вы делаете separte версию этого файла RewriteRules.config для каждой среды, содержащую только соответствующие правила и развертывающие его на соответствующем веб-сервере.

Это имеет много преимуществ.

  • Оцениваются только правила для соответствующей среды, что лучше для производительности.
  • Это более гибко, если у вас есть другие среды, такие как QA (http://qa....) и dev (http://dev....).
  • Вам не нужно беспокоиться (и проверять), будут ли правила одной среды вмешиваться в действия другой, здесь: local vs live.

Развертывание файла RewriteRules.config может быть включено в автоматизацию развертывания.