Правило не работает в правилах перезаписи, несмотря на правильное регулярное выражение

Наш файл веб-конфигурации использует переписывание 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


person MyDaftQuestions    schedule 06.07.2017    source источник
comment
Вам нужно что-то подобное? https?:\/\/(?!.*?local).*   -  person Marco Luzzara    schedule 08.07.2017
comment
Что делать, если сайт http... ссылка показывает, что мне нужно сопоставление?   -  person MyDaftQuestions    schedule 08.07.2017
comment
что ты имеешь в виду? В чем проблема с регулярным выражением выше?   -  person Marco Luzzara    schedule 08.07.2017
comment
Возможно добавление привязки к концу строки: regex101.com/r/3Mz6w1/1   -  person Casimir et Hippolyte    schedule 09.07.2017
comment
Извините, @CasimiretHippolyte, мой вопрос не ясен. Хотя у меня были некоторые проблемы с регулярным выражением, проблема больше в том, почему правило файла конфигурации игнорирует его. Я обновил свой пост, используя ваш пример   -  person MyDaftQuestions    schedule 09.07.2017


Ответы (1)


Похоже, это связано с тем, что правило перенаправления не работает

цитата из Справочник по конфигурации модуля перезаписи URL

Шаблон правила перезаписи используется для указания шаблона, с которым сравнивается текущий URL-путь.

...

Шаблон указывается в элементе ‹match› правила перезаписи.

Согласно этой официальной информации, вы должны быть уверены, что <match url сравнивается только с путями URL, которые никогда не содержат имен хостов, а не со всем URL. .

Для модуля перезаписи URL URL-адрес этого вопроса, например, questions/44944175/rule-not-working-in-rewrite-rules-despite-valid-regex. Нет stackoverflow.com нет https:// нет строк запроса, а только путь без косой черты.

Чтобы игнорировать запросы на имена хостов, содержащие local, вам нужны некоторые условия для поиска совпадения local с заголовком HTTP_HOST.

<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>
person Kul-Tigin    schedule 10.07.2017
comment
Большое спасибо за negate=true - person مهدی نبوی; 06.10.2020