如何使用web.Release.config转换进行URL重写?

我有一个web.config重写规则指定将所有stream量转移到https。 该规则的工作原理,但我不想在debugging时需要SSL。 我有一堆web.release.config转换已经完成了发布工作,所以我决定把一个重写规则在那里。 问题是重写规则不像其他设置那样被转换。 这是web.config安装程序:

<system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules runAllManagedModulesForAllRequests="true"/> <rewrite></rewrite> </system.webServer> 

这里正在进行的转型:

  <system.webServer> <rewrite> <rules> <rule name="Redirect HTTP to HTTPS" stopProcessing="true"> <match url="(.*)"/> <conditions> <add input="{HTTPS}" pattern="^OFF$"/> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther"/> </rule> </rules> </rewrite></system.webServer> 

如果我只是将重写规则复制到web.config它工作正常。 有没有人有任何想法为什么web.Release.config变换不适用于本节?

只有在需要转换的元素上放置正确的xdt属性,转换才会发生。 尝试添加一个xdt:Transform属性到您的发布configuration:

 <system.webServer xdt:Transform="Replace"> <!-- the rest of your element goes here --> </system.webServer> 

这将告诉转换引擎,来自Web.config的整个system.webServer元素需要被来自Web.Release.config元素replace。

转换引擎将默默地忽略任何没有xdt属性的元素。

强制链接到MSDN 。

另一种方法是放置一个重写条件,否则如果你在本地主机:

 <conditions> <add input="{HTTP_HOST}" pattern="localhost" negate="true"/> </conditions> 
 <system.webServer> <rewrite> <rules xdt:Transform="Replace"> <clear /> <rule name="Redirect HTTP to HTTPS" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{HTTP_HOST}" pattern="localhost(:\d+)?" negate="true" /> <add input="{HTTP_HOST}" pattern="127\.0\.0\.1(:\d+)?" negate="true" /> <add input="{HTTPS}" pattern="OFF" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther" /> </rule> </rules> </rewrite> </system.webServer> 

总结其他答案在这里,我们发现了显而易见的:“replace”将只replace一个节点,而不是“插入”它(谢谢DigitalD的正确轨道)。 我们其余的转换文件使用replace,所以我们select了一个空的标签在我们的基本web.config(一个被转换)。

 <system.webServer> ...other tags here that do not get transformed... <rewrite /> </system.webServer> 

理想情况下,将会有“覆盖”,将插入或replace(或删除和插入)。