Я пытаюсь настроить структуру каталогов на веб-сайте IIS с применением правил перезаписи на разных уровнях. Например, рассмотрим следующую структуру:
Веб-сайт по умолчанию
✓ web.config
â v1
✓ web.config
â wwwroot
â привет.txt
Я хочу иметь доступ привет.txt
через http://localhost/hello.txt. я настроил web.config
на корневом уровне веб-сайта следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite to v1" stopProcessing="false">
<match url="^(?!v1).*" />
<action type="Rewrite" url="v1\{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
И я настроил web.config
в v1
такой каталог:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite to wwwroot" stopProcessing="false">
<match url="^(?!wwwroot).*" />
<action type="Rewrite" url="wwwroot\{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Одноуровневая перезапись работает, когда я обращаюсь к http://localhost/v1/hello.txt, но двухуровневая перезапись не работает для http://localhost/hello.txt. Страница ошибки IIS показывает, что запрос все еще разрешается на физический путь â¦\v1\hello.txt
скорее, чем â¦\v1\wwwroot\hello.txt
; видеть https://i.stack.imgur.com/KjdH5.png. Обратите внимание, что изменение перезаписи на перенаправление позволяет успешно обслуживать файл.
Есть ли способ заставить это работать, или это какое-то ограничение модуля перезаписи URL? Microsoft, кажется, утверждает, что это поддерживается в Справочник по конфигурации модуля перезаписи URL:
Наследование правил
Если правила определены на нескольких уровнях конфигурации, модуль перезаписи URL оценивает правила в следующем порядке:
- Оцените все глобальные правила.
- Оцените набор правил, который включает распределенные правила из родительских уровней конфигурации, а также правила из текущего уровня конфигурации. Оценка выполняется в порядке от родителя к дочернему, что означает, что родительские правила оцениваются первыми, а правила, определенные на последнем дочернем уровне, оцениваются последними.
Я знаю, что могу сделать web.config
на корневом уровне веб-сайта ссылайтесь на внутренний wwwroot
каталог напрямую (через url="v1\wwwroot\{R:0}"
). Однако я не хочу этого делать. В конечном итоге я буду расширять внешний web.config
для поддержки других версий (v2
, v3
, ¦), которые также могут иметь или не иметь wwwroot
подкаталог, поэтому было бы намного чище сохранять любые перезаписываемые версии для внутренних подкаталогов в специфичной для версии web.config
.
Я пробовал использовать Failed Request Tracing. внешнее правило, Переписать на v1
, регистрируется для успешного выполнения. Нет упоминания о внутреннем правиле, Переписать на wwwroot
.