如何使 URL 重写与 web.Release.config 转换一起工作?
Posted
技术标签:
【中文标题】如何使 URL 重写与 web.Release.config 转换一起工作?【英文标题】:How do I make URL rewrite work with web.Release.config transform? 【发布时间】:2011-10-23 15:51:18 【问题描述】:我指定了一个 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 转换仅适用于本节?
【问题讨论】:
我也很想知道这是怎么回事。转换的行为似乎不像它应该的那样。 【参考方案1】:只有在需要转换的元素上放置正确的xdt
属性时才会发生转换。尝试在发布配置中添加 xdt:Transform
属性:
<system.webServer xdt:Transform="Replace">
<!-- the rest of your element goes here -->
</system.webServer>
这将告诉转换引擎来自Web.config
的整个system.webServer
元素需要替换为来自Web.Release.config
的元素。
转换引擎将静默忽略任何不具有xdt
属性的元素。
MSDN 的必填链接。
【讨论】:
文件更复杂的人的额外说明。您可以将xdt:Transform
元素放在<rewrite>
标记上并将其更改为插入,如下所示:<rewrite xdt:Transform="Insert">
这将保留您的<system.webServer>
部分中的任何其他标记。
我讨厌 web.config 转换。这是谁设计的。
其实web.config
的转换很灵巧……有些人只是停留在过去……
使用什么好的架构?我有'schemas.microsoft.com/XML-Document-Transform',VS 2015 告诉我 xdt:Transform 没有在 <system.webServer>
中的 Transform,但不希望它在下面的 <rewrite>
或 <rules>
中。但其他人报告它仍然有效。【参考方案2】:
另一种方法是设置一个重写条件,如果你在 localhost 上则否定:
<conditions>
<add input="HTTP_HOST" pattern="localhost" negate="true"/>
</conditions>
【讨论】:
很棒的解决方案。值得注意的是,如果您使用的是 Chrome - Chrome 会缓存重定向 - 因此您可能需要清除缓存:superuser.com/questions/304589/…【参考方案3】:<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>
【讨论】:
如果您的 web.config 中没有重写元素,您也可以使用在这里总结其他答案,我们发现很明显:“替换”只会替换一个节点,而不是“插入”它(感谢 DigitalD 的正确轨道)。我们的其余转换文件使用替换,因此我们在基本 web.config 中选择了一个空标签(被转换的那个)。
<system.webServer>
...other tags here that do not get transformed...
<rewrite />
</system.webServer>
理想情况下会有插入或替换(或删除和插入)的“覆盖”。
【讨论】:
以上是关于如何使 URL 重写与 web.Release.config 转换一起工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何使 Zend Framework 2 与 nginx 一起工作?
URL重写:RewriteCond指令与RewriteRule 指令格式
ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL