URL-адрес перенаправления IIS для виртуального каталога

Как установить URL-адрес перенаправления для виртуального каталога в IIS 7.0? Я установил последний модуль перезаписи URL 2.x.

Я могу объяснить свою проблему на примере:

У меня есть сайт на моем сервере IIS 7.0, www.mysite.com. Я решил создать виртуальный каталог "Продажи" под моим сайтом, который указывает на корневой каталог веб-сайта. Теперь мне нужно создать URL-адрес перенаправления для vdir. Vdir указывает на тот же виртуальный корневой каталог, что и мой корень сайта.

Большая идея заключается в том, что я могу перейти на www.mysite/sales, и я автоматически перенаправляюсь на www.mysite.com?productid=200.

Я попытался перенаправить URL-адрес перезаписи для vdir (не веб-сайт), но я всегда получаю это сообщение об ошибке:

Cannot add duplicate collection entry of type 'rule' with unique key 
attribute 'name' set to "test".

Это происходит, когда я указываю на виртуальный vdir и пытаюсь добавить правило.

Я могу добавить правила на уровень веб-сайта, но правила не работают. Я имею в виду URL-адрес "www.mysite/sales", который дает мне следующую ошибку. Я знаю, что ключ уникален. Я проверил его из web.config.

Эта функция была очень проста в использовании в IIS 6.0, просто укажите на vdir с помощью мыши и задайте свойства → перенаправление на URL.

Пожалуйста, объясните, как правильно это сделать в IIS 7.0?

Ответы

Ответ 1

На самом деле не так просто, но не слишком ужасно.

1) Создайте физический каталог вместо виртуального каталога.

2) Убедитесь, что у вас есть службы роли переадресации HTTP. См. http://www.iis.net/ConfigReference/system.webServer/httpRedirect

3) Откройте диспетчер IIS и перейдите к физическому каталогу, который вы хотите перенаправить.

4) Дважды щелкните значок "Перенаправление HTTP" в разделе IIS.

5) Установите флажок "Перенаправить запросы в этот пункт назначения" и введите новый URL-адрес (http://example.com/newPage.html)

6) При необходимости проверьте следующие два поля; Я считаю, что обычно необходимо проверить оба.

7) Нажмите кнопку "Применить".

8) Выберите "Веб-сайт" и "Перезапустить" в разделе "Управление веб-сайтом".

9) Тест.

Ответ 2

Причина, по которой это происходит, заключается в том, что по умолчанию все конфигурации правил наследуются от родительских веб-приложений. Поэтому, если в корневом веб-сайте есть правило, оно наследуется на всех последующих дочерних сайтах в иерархии; если он не очищен.

Итак, для примера, если иерархия приложений IIS выглядит следующим образом:

Веб-сайт по умолчанию (Root)

| Веб-приложение 1 (VDir1) | Веб-приложение 11 (VDir2)

| Веб-приложение 2 (VDir3)

Правило с именем "Test", если оно существует в корневом приложении, наследуется к веб-приложению 1, веб-приложению 11 и веб-приложению 2

В вашем случае веб-приложение 11 (VDir2) физически находится в том же месте, что и (VDir1). Следовательно, конфигурации IIS одинаковы для обоих каталогов, поскольку он имеет один и тот же файл Web.config.

Таким образом, любое новое правило, добавленное в файл Web.config, автоматически будет применено к обеим виртуальным каталогам (VDir1 и VDir2). И поскольку правила по умолчанию унаследованы, механизм правил в IIS будет обнаруживать проблему при разборе правила, поскольку он уже существует по наследству.

Возможным решением было бы добавить < Clear/" > перед добавлением какого-либо правила в файл web.config, чтобы он удалил любое унаследованное правило.

<rewrite>
   <rules>
     <clear/>
     <rule name="test" stopProcessing="true">
        <match xxx />
        <action xxx />
     </rule>
   </rules>
</rewrite>

Однако я бы предпочел < Удалите тег name= "Имя правила" /" > вместо целевого, удалив только правило, которое нужно добавить в унаследованную конфигурацию. Это обеспечит, чтобы все остальные Правила на корневом веб-сайте были унаследованы в иерархии; причем только это новое правило (вроде) переопределено.

<rewrite>
   <rules>
     <remove name="test"/>
     <rule name="test" stopProcessing="true">
        <match xxx />
        <action xxx />
     </rule>
   </rules>
</rewrite>