2010-04-27 3 views
13

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

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

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

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

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

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

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

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

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

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

+0

Смотрите также [URL Rewrite подкаталога в другой домен с помощью IIS] (https://stackoverflow.com/questions/22392522/url-rewrite-of-a-subdirectory-to-a-different- domain-using-iis) вместо прямого перенаправления. – Vadzim

ответ

28

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

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) Испытание.

+0

Хороший ответ, +1 – ajdams

+0

Спасибо, это помогло –

+0

Работал отлично, но мне не нужно было перезапускать сайт в IIS 8.5. –

2

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

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

Default Web Site (Root)

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

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

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

В вашем случае Web Приложение 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> 

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

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

Действительно ли это работает? Это гений. – Gaspa79

+0

@ Gaspa79, это обязательно. вы можете попробовать и опубликовать свои результаты. – XpertSiji

+0

Да, я попробовал и работал чудесами. Большое спасибо! – Gaspa79

Смежные вопросы