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>