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

Как установить 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?

Ответы [ 2 ]

28 голосов
/ 19 мая 2010

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

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

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

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

4) Дважды щелкните значок «HTTP Redirect» под IIS.

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

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

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

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

9) Тест.

2 голосов
/ 01 мая 2014

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

Так, например, если иерархия приложений 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>
...