45

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

4 回答 4

45

xdt只有在需要转换的元素上放置适当的属性时,才会发生转换。尝试向xdt:Transform您的发布配置添加一个属性:

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

这将告诉转换引擎整个system.webServer元素 fromWeb.config需要替换为 from Web.Release.config

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

到MSDN的强制性链接。

于 2011-08-10T22:58:10.317 回答
33

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

<conditions>
    <add input="{HTTP_HOST}" pattern="localhost" negate="true"/>
</conditions>
于 2011-08-21T07:41:53.397 回答
10
<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>
于 2015-06-22T19:27:36.807 回答
2

在这里总结其他答案,我们发现很明显:“替换”只会替换一个节点,而不是“插入”它(感谢 DigitalD 的正确轨道)。我们的其余转换文件使用替换,因此我们在基本 web.config(被转换的那个)中选择了一个空标签。

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

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

于 2013-09-10T20:18:33.853 回答