51

我有一些 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 中的重写规则,如果可以,我错过了什么?

4

5 回答 5

55

由于我的主 web.config 中没有任何重写规则,因此 Replace 转换不起作用。我成功使用了插入变换,如下:

  <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>
于 2013-11-27T18:05:52.283 回答
10

在创建发布配置时,重写部分对我来说很奇怪,错误和部分根本没有显示。这就是我解决它的方法。

Microsoft (R) Build Engine 版本 12.0.31101.0

Microsoft .NET 框架,版本 4.0.30319.0

编辑在搞砸了这个之后,我意识到在没有重写插件的服务器上拥有重写标签会使网络服务器返回错误。我想要服务器和本地开发机器上的不同配置,所以修复是:

未转换的 web.config 只需要一个 <system.webServer> 标记和 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>

该操作根本不需要名称,但重写标签需要 xdt:Transform="Insert"

显然,如果您也希望在本地计算机上使用它,则需要进行更新。

于 2015-06-05T14:07:07.833 回答
10

这里有很多带有示例的答案,这是一件好事,但我认为缺少一些细节。我已经在我的网站上写过这个,这里的关键点是添加xdt:Transform="Insert"你想要为相应环境添加的根标签层次结构。

默认情况下,您有 Web.config 文件,但也有 Web.Debug.config 和 Web.Release.config,如下图所示:

在此处输入图像描述

假设您想在您的应用程序版本中添加从 http 到 https 的重定向。然后编辑 Web.Release.config 并添加以下行:

<?xml version="1.0"?>

.....
  <system.webServer>
    <rewrite xdt:Transform="Insert">
      <rules>
        ......
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

因此,下次您发布项目时,带有 rewrite 的标签及其子内容将被添加到 web.config 文件中。

要在发布之前查看它,请右键单击 Web.Release.config 并单击 Preview Transform。

在此处输入图像描述

您将看到初始版本和发布版本之间的差异。

在此处输入图像描述

参考:

免责声明:本指南链接参考我的个人网站。

于 2018-03-24T16:22:41.743 回答
2

可以转换 system.webServer 的重写部分。我最初遇到了同样的问题,并意识到我无意中将重写节点错误地放置在 system.web 下。尽管根据您提供的有限代码段,这看起来不像您的问题,但我仍然怀疑您的问题与转换文件中的节点位置有关。

这是我的 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>
于 2012-08-25T13:42:08.013 回答
0

我使用的一个技巧是给动作一个名称
,然后在我的转换中添加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

- - - -更新 - - -

只是将名称添加到操作的更新将无法正常工作,因此我将代码更新如下

 <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>
于 2015-02-27T22:52:57.833 回答