Рейтинг:0

Применение правил перезаписи IIS из нескольких web.configs для одного запроса

флаг it

Я пытаюсь настроить структуру каталогов на веб-сайте 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 оценивает правила в следующем порядке:

  1. Оцените все глобальные правила.
  2. Оцените набор правил, который включает распределенные правила из родительских уровней конфигурации, а также правила из текущего уровня конфигурации. Оценка выполняется в порядке от родителя к дочернему, что означает, что родительские правила оцениваются первыми, а правила, определенные на последнем дочернем уровне, оцениваются последними.

Я знаю, что могу сделать web.config на корневом уровне веб-сайта ссылайтесь на внутренний wwwroot каталог напрямую (через url="v1\wwwroot\{R:0}"). Однако я не хочу этого делать. В конечном итоге я буду расширять внешний web.config для поддержки других версий (v2, v3, ¦), которые также могут иметь или не иметь wwwroot подкаталог, поэтому было бы намного чище сохранять любые перезаписываемые версии для внутренних подкаталогов в специфичной для версии web.config.

Я пробовал использовать Failed Request Tracing. внешнее правило, Переписать на v1, регистрируется для успешного выполнения. Нет упоминания о внутреннем правиле, Переписать на wwwroot.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.