У меня есть настройка перезаписи 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>