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

Замена правил перезаписи 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, и если да, то что мне не хватает?

4b9b3361

Ответ 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>