我指定了一个web.config重写规则,以将所有流量移至https。该规则有效,但我在调试时不需要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转换不仅适用于此部分?
答案 0 :(得分:44)
只有在需要转换的元素上放置适当的xdt
属性时,才会发生转换。尝试在发布配置中添加xdt:Transform
属性:
<system.webServer xdt:Transform="Replace">
<!-- the rest of your element goes here -->
</system.webServer>
这将告诉转化引擎,system.webServer
中的整个Web.config
元素需要替换为来自Web.Release.config
的元素。
转化引擎会默默地忽略任何没有xdt
属性的元素。
MSDN的强制性链接。
答案 1 :(得分:33)
另一种方法是设置一个重写条件,如果你在localhost上则会否定:
<conditions>
<add input="{HTTP_HOST}" pattern="localhost" negate="true"/>
</conditions>
答案 2 :(得分:9)
<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>
答案 3 :(得分:2)
总结其他答案,我们发现了显而易见的:“替换”只会替换一个节点,而不是“插入”它(感谢DigitalD为正确的轨道)。我们的转换文件的其余部分使用replace,所以我们在我们的基础web.config(转换的那个)中选择了一个空标记。
<system.webServer>
...other tags here that do not get transformed...
<rewrite />
</system.webServer>
理想情况下会有“覆盖”,即插入或替换(或删除和插入)。