Как сделать так, чтобы перезапись URL работала с преобразованием web.Release.config? - PullRequest
45 голосов
/ 10 августа 2011

У меня есть правило перезаписи 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 не работают только для этого раздела?

Ответы [ 4 ]

44 голосов
/ 11 августа 2011

Преобразование произойдет только в том случае, если вы поместите надлежащие атрибуты 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 .

33 голосов
/ 21 августа 2011

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

<conditions>
    <add input="{HTTP_HOST}" pattern="localhost" negate="true"/>
</conditions>
9 голосов
/ 22 июня 2015
<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>
2 голосов
/ 11 сентября 2013

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

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

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

...