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