Причина, по которой это происходит, заключается в том, что по умолчанию все конфигурации правил наследуются от родительских веб-приложений. Таким образом, если есть правило, определенное внутри корневого сайта, оно наследуется на всех последующих дочерних сайтах в иерархии; если не очищено.
Так, например, если иерархия приложений IIS следующая -
Веб-сайт по умолчанию (Root)
| Веб-приложение 1 (VDir1) | Веб-приложение 11 (VDir2)
| Веб-приложение 2 (VDir3)
Правило с именем «Test», если оно существует в корневом приложении, оно наследуется веб-приложению 1, веб-приложению 11 и веб-приложению 2
В вашем случае веб-приложение 11 (VDir2) физически находится в том же местоположении, что и (VDir1). Следовательно, конфигурации IIS одинаковы для обоих каталогов, поскольку он использует один и тот же файл Web.config.
Таким образом, любое новое правило, добавленное в файл Web.config, будет автоматически применено к обоим этим виртуальным каталогам (VDir1 и VDir2). А поскольку правила наследуются по умолчанию, обработчик правил в IIS обнаружит проблему при синтаксическом анализе правила, поскольку оно уже существует в результате наследования.
Возможным решением было бы добавить тег перед добавлением любого правила в файле web.config, чтобы оно очищало любое унаследованное правило.
<rewrite>
<rules>
<clear/>
<rule name="test" stopProcessing="true">
<match xxx />
<action xxx />
</rule>
</rules>
</rewrite>
Однако вместо этого я бы предпочел, чтобы тег предназначался для удаления только правила, которое необходимо добавить в унаследованную конфигурацию. Это обеспечит наследование всех других правил на корневом веб-сайте в иерархии; только с этим новым правилом (вроде) переопределяемым.
<rewrite>
<rules>
<remove name="test"/>
<rule name="test" stopProcessing="true">
<match xxx />
<action xxx />
</rule>
</rules>
</rewrite>