Назад | Перейти на главную страницу

Предотвращение наследования правил перезаписи URL-адресов подкаталогами в IIS7

У меня есть настройка перезаписи URL-адресов для чистых URL-адресов в CMS, и мой файл 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=something в something для чистых URL. Очень просто и хорошо работает.

Как это часто бывает в CMS, для предотвращения взлома серверной части каждый подкаталог требует либо <remove name="Clean URLs" /> или <clear /> в его web.config, поэтому правило не наследуется.

Есть ли способ указать в родительском правиле, что оно вообще не должно наследоваться его дочерними элементами, каким-то образом ограничив область действия правила только текущим каталогом? Что-то вроде <rule name="Clean URLs" stopProcessing="true" inherit="no"> было бы эпично.

Нашел ответ через 4,5 часа гугла!

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

В основном используя преимущества

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

Я недавно столкнулся с этой проблемой в похожей ситуации. Но ответ Рьенкинса, похоже, вызовет проблемы с виртуальными приложениями, которые полагаются на наследование родительских настроек.

Если вы знаете название правила перезаписи, вы можете просто сделать это:

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