防止 URL 重写规则被 IIS7 中的子目录继承

防止 URL 重写规则被 IIS7 中的子目录继承

我在 CMS 中设置了用于清理 URL 的 URL 重写,我的 web.config 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Clean URLs" stopProcessing="true">
                    <match url="^([^/]+)/?$" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="?id={R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

它基本上变成index.php?id=somethingsomething干净的 URL。非常简单,而且效果很好。

正如在 CMS 中常见的那样,为了防止后端中断,每个子目录都需要在其 web.config 中使用<remove name="Clean URLs" /><clear />,这样规则就不会被继承。

有没有办法在父规则中指定它根本不应该被其子规则继承,即以某种方式将规则的范围限制为当前目录?类似的东西<rule name="Clean URLs" stopProcessing="true" inherit="no">将是史诗。

答案1

经过 4.5 小时的 Google 搜索后找到了答案!

http://runtingsproper.blogspot.co.uk/2010/04/solved-breaking-parent-webconfig.html

基本上利用

<location path="." inheritInChildApplications="false"> 
    <system.webServer>
        <!-- ... -->
    </system.webServer>
</location>

答案2

我最近遇到了这个问题,情况类似。但 rjenkins 的答案似乎会导致依赖父级设置继承的虚拟应用程序出现问题。

如果您知道重写规则的名称,您可以这样做:

<rewrite>
  <rules>
    <remove name="RewriteNameToDisable" />
  </rules>
</rewrite>

相关内容