Подтвердить что ты не робот

Как заставить URL переписывать работу с преобразованием web.Release.config?

У меня есть правило перезаписи web.config, указанное для перемещения всего трафика на https. Правило работает, но я не требую SSL, пока я отлаживаю. У меня есть ряд преобразований web.release.config, которые уже выполняются, чтобы работать над публикацией, поэтому я решил разместить там правило перезаписи. Проблема в том, что правило перезаписи не преобразуется, как остальные настройки. Вот настройка web.config:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>

    <rewrite></rewrite>
</system.webServer>

И здесь выполняется преобразование:

  <system.webServer>
<rewrite>
  <rules>
    <rule name="Redirect HTTP to HTTPS" stopProcessing="true">
      <match url="(.*)"/>
      <conditions>
        <add input="{HTTPS}" pattern="^OFF$"/>
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther"/>
    </rule>
  </rules>
</rewrite></system.webServer>

Если я просто скопирую правило перезаписи в web.config, он отлично работает. Кто-нибудь есть идеи, почему преобразования web.Release.config не работают только для этого раздела?

4b9b3361

Ответ 1

Трансформация произойдет, только если вы нанесете правильные атрибуты xdt на элементы, которые необходимо преобразовать. Попробуйте добавить атрибут xdt:Transform в конфигурацию выпуска:

<system.webServer xdt:Transform="Replace">
    <!-- the rest of your element goes here -->
</system.webServer>

Это покажет механизму преобразования, что весь элемент system.webServer из Web.config должен быть заменен на один из Web.Release.config.

Механизм преобразования молча игнорирует любые элементы, которые не имеют атрибутов xdt.

Обязательная ссылка на MSDN.

Ответ 2

Другим способом было бы включить условие перезаписи, которое отменяет, если вы находитесь на localhost:

<conditions>
    <add input="{HTTP_HOST}" pattern="localhost" negate="true"/>
</conditions>

Ответ 3

<system.webServer>
    <rewrite>
        <rules xdt:Transform="Replace">
            <clear />
            <rule name="Redirect HTTP to HTTPS" stopProcessing="true">
              <match url="(.*)" />
              <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                <add input="{HTTP_HOST}" pattern="localhost(:\d+)?" negate="true" />
                <add input="{HTTP_HOST}" pattern="127\.0\.0\.1(:\d+)?" negate="true" />
                <add input="{HTTPS}" pattern="OFF" />
              </conditions>
              <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther" />
            </rule>
        </rules>          
    </rewrite>
</system.webServer>

Ответ 4

Подводя другие ответы здесь, мы обнаружили очевидное: "Заменить" заменит node, а не "Вставить" его (спасибо DigitalD для правильной дорожки). Остальные наши файлы преобразования используют замену, поэтому мы выбрали пустой тег в нашей базе web.config(тот, который преобразуется).

<system.webServer>
...other tags here that do not get transformed...
<rewrite />
</system.webServer>

В идеале будет "Перезаписать", который будет вставлять или заменять (или удалять и вставлять).