Правило перезаписи 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
может быть включено в автоматизацию развертывания.