Предотвращение наследования правил перезаписи 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">
было бы эпично.
2 ответа
Нашел ответ через 4,5 часа Гугля!
http://runtingsproper.blogspot.co.uk/2010/04/solved-breaking-parent-webconfig.html
В основном пользуясь
<location path="." inheritInChildApplications="false">
<system.webServer>
<!-- ... -->
</system.webServer>
</location>
Я недавно столкнулся с этой проблемой, в похожей ситуации. Но ответ от rjenkins может вызвать проблемы с виртуальными приложениями, которые основаны на наследовании родительских настроек.
Если вы знаете имя правила перезаписи, вы можете просто сделать это:
<rewrite>
<rules>
<remove name="RewriteNameToDisable" />
</rules>
</rewrite>