Как заставить 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 не работают только для этого раздела?
Ответы
Ответ 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>
В идеале будет "Перезаписать", который будет вставлять или заменять (или удалять и вставлять).