Замена правил перезаписи IIS в преобразовании web.config
У меня есть некоторые правила перезаписи IIS, которые я хочу изменить в зависимости от среды. Правила перезаписи разработки находятся в файле web.config, а затем в конце файла web.test.config у меня есть:
<appSettings>
...Some app settings tranforms here
</appSettings>
<system.webserver>
<rewrite xdt:Transform="Replace">
<rules>
... rules here
</rules>
</rewrite>
</system.webserver>
</configuration>
Настройки моего приложения преобразуются при развертывании для тестирования, но правилами перезаписи IIS нет. Я надеялся, что весь раздел <rewrite>
будет просто заменен на один в файле преобразования (согласно http://msdn.microsoft.com/en-us/library/dd465326.aspx), но ничего не происходит изменение.
Я тоже пробовал помещать xdt:Transform="Replace" xdt:Locator="Match(name)">
в отдельные правила:
<rule name="Test rule" stopProcessing="true" xdt:Transform="Replace" xdt:Locator="Match(name)">
Но опять же это не имеет значения.
Можно ли даже заменить правила перезаписи в файле web.config, и если да, то что мне не хватает?
Ответы
Ответ 1
Поскольку у меня не было правил перезаписи в моем основном web.config, преобразование Заменить не сработало. Я успешно использовал преобразование Insert, как показано ниже:
<system.webServer>
<rewrite xdt:Transform="Insert">
<rules>
<rule name="CanonicalHostNameRule1">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.mysite\.com$" negate="true" />
</conditions>
<action type="Redirect" url="http://www.mysite.com/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
Ответ 2
Секция перезаписи сработала для меня с первого взгляда при создании конфигураций релиза, ошибок и разделов, которые вообще не отображаются. Вот как я это решил.
Microsoft (R) Build Engine версия 12.0.31101.0
Microsoft.NET Framework, версия 4.0.30319.0
Изменить. После беспорядка с этим я понял, что наличие тега перезаписи на сервере, у которого нет плагина перезаписи, заставляет веб-сервер возвращать ошибку. У меня нет разных конфигураций на сервере и на локальной машине разработчиков, поэтому исправление:
Неизбранному web.config нужен только тег и в файле web.config.release для основного правила имени канонического хоста
<configuration>
<system.webServer>
<rewrite xdt:Transform="Insert">
<rules>
<rule name="CanonicalHostNameRule" xdt:Transform="Insert">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.host\.com$" negate="true" />
</conditions>
<action type="Redirect" url="http://www.host.com/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Действие не нуждалось в имени вообще, но тег rewrite нуждается в xdt: Transform = "Insert"
Очевидно, если вы захотите также на своем локальном компьютере, вместо этого потребуется обновление.
Ответ 3
Можно преобразовать раздел перезаписи system.webServer. Первоначально у меня была такая же проблема, и я понял, что я случайно поместил rewrite node неправильно в system.web. Хотя это не похоже на вашу проблему на основе ограниченного фрагмента, который вы предоставили, я все же подозреваю, что ваша проблема связана с размещением node в файле преобразования.
Вот как выглядит мой Web.Debug.config(и эта версия записывает правильный файл Web.config в сборке отладки):
<?xml version="1.0"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an atrribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
<system.webServer>
<rewrite xdt:Transform="Replace">
<rules>
<clear/>
<rule name="Canonical Hostname">
<!-- Note that I have stripped out the actual content of my rules for the purposes of posting here... -->
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Ответ 4
Трюк, который я использую, дает действие имя
то в моем преобразовании просто добавьте xdt:Transform="SetAttributes" xdt:Locator="Match(name)"
, как показано ниже
<system.webServer>
<rewrite>
<rules>
<rule name="RedirecttoWWW" enabled="true" >
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" negate="true" pattern="^www\.([.a-zA-Z0-9]+)$" />
</conditions>
<action name="AddWWW" type="Redirect" url="http://www.{HTTP_HOST}/{R:0}" appendQueryString="true" redirectType="Permanent" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
</rule>
</rules>
</rewrite>
В приведенном выше примере добавляется www ко всем запросам
------- ----- UPDATE
просто обновление, добавляющее имя к действию, не будет работать так, как хотелось бы, поэтому я обновил код следующим образом
<system.webServer>
<rule name="RedirecttoWWW" enabled="true" xdt:Transform="RemoveAll" xdt:Locator="Match(name)" >
</rule>
<rule name="RedirecttoWWW" enabled="true" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)" >
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" negate="true" pattern="^www\.([.a-zA-Z0-9]+)$" />
</conditions>
<action type="Redirect" url="http://{HTTP_HOST}/{R:0}" appendQueryString="true" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>