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

时间:2011-08-09 23:00:37

标签: asp.net asp.net-mvc web-config-transform

我指定了一个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转换不仅适用于此部分?

4 个答案:

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

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