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


11

我有一个用于CMS中干净URL的URL Rewrite设置,我的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清洁的网址。非常简单,效果很好。

与CMS中常见的一样,为防止后端损坏,每个子目录都需要一个目录<remove name="Clean URLs" /><clear />在其web.config中,因此该规则不会被继承。

是否可以通过某种方式将规则的范围限制为仅当前目录,来在父规则中指定它根本不应该由其子级继承?像是<rule name="Clean URLs" stopProcessing="true" inherit="no">史诗般的东西。

Answers:



6

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

如果您知道重写规则的名称,则可以执行以下操作:

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

2
那是我的第一次尝试,但是您必须将它放在每个子目录的web.config中,但这并不总是可行的。我同意它更干净,但是需要更多工作,尤其是当子目录中可能存在重写(例如子文件夹中cms的另一个实例)时
Rich Jenks
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.