在web.config转换中replaceIIS重写规则

我有一些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> 

当我部署testing时,我的应用程序设置正在变换,但是由IIS重写规则不是。 我希望整个<rewrite>部分将被replace为转换文件中的一个(按照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中的重写规则,如果是这样,我错过了什么?

因为我的主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> 

重写部分首先在创build发布configuration,错误和部分时根本不起作用。 这是我如何解决它。

Microsoft(R)Build Engine版本12.0.31101.0

Microsoft .NET Framework,版本4.0.30319.0

编辑之后搞乱了这个我意识到,有一个服务器上没有重写插件的重写标记使Web服务器返回一个错误。 我不想在服务器和本地开发机器上configuration不同的configuration,所以解决的办法是:

未转换的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> 

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

显然,如果你想在你的本地机器上,它会需要一个更新。

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

这是我的Web.Debug.config的样子(和这个版本正在编写一个debugging版本正确的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> 

我使用的一个技巧是给动作一个名字
然后在我的转换只需添加xdt:Transform="SetAttributes" xdt:Locator="Match(name)" like following

 <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>