В этой статье я хочу описать не самый типичный сценарий, который, тем не менее, имеет право на жизнь.
Дело в том, что мы используем IIS как прокси для других веб-серверов компании.
Расскажу, как это было реализовано и с какими трудностями мне пришлось столкнуться.
Постановка задачи Давайте рассмотрим в качестве примера сервер YouTrack. Он представлен неприглядным srv-youtrack-01.local.domain и расположен на веб-сервере внутри компании.
Задача — обеспечить к нему доступ из сети Интернет, используя красивое имя yt.company.ru. В этом случае необходимо использовать https. Выполнение Для начала нам необходимо установить компонент Перезапись URL-адреса .
Это можно сделать с помощью установщика веб-платформы, а также вручную .
После его установки мы увидим новый ярлык в диспетчере служб IIS. Перезапись URL-адресов».
Используя этот инструмент, вы можете создать правило перезаписи адреса «обратного прокси».
При создании правила необходимо указать URL-адрес сервера (без префикса http:// — IIS добавит его автоматически), к которому будет происходить проксирование.
В результате мы получим правило, которое можно редактировать.
Это касается не всех запросов, а только тех, которые соответствуют критериям, которые мы можем настроить.
Сначала URL проверяется на соответствие шаблону, после чего проверяются остальные критерии.
Сразу оговорюсь, что здесь есть два пути: первый способ — создать набор правил с разными шаблонами URL для разных ресурсов на одном IIS-сайте; а второй — создать сайт для каждого проксируемого ресурса и сделать в каждом из них по одному правилу.
Поняв, что первый путь больше джедайский, я все же выбрал второй путь — хоть и не такой красивый, но я не рискую написать неправильное регулярное выражение для одного сайта и сломать всю маршрутизацию.
Поэтому мой шаблон URL-адреса по умолчанию везде — «(.
*)».
Итак, я создаю сайт yt.company.ru с привязками для портов 80 и 443 и обязательным именем хоста, чтобы IIS знал, к какому сайту я обращаюсь.
Позволю себе не упомянуть о получении и установке сертификата на 443. Сразу отмечу, что сам сервис не нужно настраивать на использование https - внутри сети некому будет шифровать, и внешние запросы будут подключен через SSL к пограничному серверу, который будет проксировать запросы внутри сети через незащищенный канал.
Хотя использование https является обязательным требованием, мы будем проксировать только те запросы, которые приходят на порт 443, для чего создадим простое условие.
При его создании предлагается выпадающий список возможных вариантов.
Отлично, теперь все запросы yt.company.ru пересылаются на внутренний сервер с неприглядным именем srv-youtrack-01.local.domain, прозрачным для пользователя.
Однако все запросы yt.company.ru обрезаются с ошибкой 403, что не очень приятно.
Для решения этой проблемы можно либо создать index.html с редиректом, либо другое правило URL Rewrite, в котором в поле «действие» выбираем постоянный редирект на нужный нам URL.
Обратите внимание, что правила сайта применяются по порядку, поэтому сначала нужно разместить правило с условием, а затем правило без условий.
В данном случае, поскольку второе правило распространяется на все URL без исключения, для первого правила нужно установить (оставить отмеченным) флажок «Остановить обработку последующих правил».
После манипуляций с графическим интерфейсом в корне нашего сайта создается web.config, содержащий все созданные правила.
Поэтому если вам необходимо проксировать другой сайт, то эти манипуляции повторять не нужно; вы можете просто скопировать web.config и изменить в нем нужный URL, либо после копирования использовать графический интерфейс для изменения правил.
Более того, можно вообще не пользоваться интерфейсом, а писать прямо там — как угодно.
Подводные скалы Когда вы переходите на вкладку «Agile-доски», YouTrack генерирует URL-адрес типа yt.company.ru/rest/agile/Overview-0/sprint/Iteration+24 .
Далее при переключении между спринтами yt.company.ru/rest/agile/Overview-0/sprint/Iteration%252023Эq= .
Когда я перешел по этим URL-адресам, IIS начал возвращать мне ошибку 404. Это указывало на то, что запросы не пересылались.
В этом случае переходы между сохраненными запросами вида yt.company.ru/issues/ITЭq=%23 {Текущая+работа}+Назначено%3A+мне+обновлено%3A+{На+неделе} работал вполне корректно.
«Эксперименты с добавлением вопросительного знака в середину проблемного URL закончились тем, что я начал получать ошибку 404 от сервера YouTrack, а не от IIS. Это заставило меня подумать, что IIS по какой-то причине (привет, Microsoft) интерпретирует URL-адрес и это нужно исправить.
Проблема со знаком плюсика в середине адреса решилась добавлением параметра requestFilteringallowDoubleEscaping="true" :
Но после этого переключение между спринтами все равно не работало.<system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer>
Оказалось, что IIS считает такие запросы небезопасными.
Ээту проверку также пришлось отключить: <system.web>
<httpRuntime requestPathInvalidCharacters="" />
</system.web>
Вот такой web.config получился после всех манипуляций: <Эxml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="ProxyToYouTrack" patternSyntax="ECMAScript" stopProcessing="true">
<match url="(.
*)" negate="false" /> <action type="Rewrite" url=" http://srv-youtrack-01.local.domain/{R:1 }" appendQueryString="true" logRewrittenUrl="true" /> <conditions> <add input="{SERVER_PORT}" pattern="443" /> </conditions> </rule> <rule name="redir to ssl" enabled="true" stopProcessing="true"> <match url="(.
*)" />
<action type="Redirect" url=" https://yt.company.ru " />
</rule>
</rules>
<outboundRules>
<preConditions>
<preCondition name="ResponseIsHtml1">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
<system.web>
Теги: #IIS #web #Windows #IIS
-
Iriver T9: Встряхните Свою Музыку
19 Oct, 24 -
Учим Android Писать На Древнегреческом Языке
19 Oct, 24 -
Как Работать С «Определенными» Токенами
19 Oct, 24 -
Марк Кьюбан - 6 Вещей Для Великих
19 Oct, 24 -
По Школьному Расписанию
19 Oct, 24