Обратный прокси-сервер с переопределением URL-адресов версии 2 и маршрутизацией запросов приложений

Руслан Якушев

В этом пошаговом руководстве описано, как использовать модуль переопределения URL-адресов и маршрутизацию запросов приложений (ARR) для реализации обратного прокси-сервера для нескольких внутренних приложений.

Предварительные требования

Чтобы выполнить это пошаговое руководство, вам потребуется следующее:

  1. IIS 7 или более поздней версии с включенной службой ASP.NET роли.
  2. Установленный модуль переопределения URL-адресов (требуется версия 2.0, если вы хотите выполнить часть о перезаписи ответа)
  3. Установлена маршрутизация запросов приложений версии 1.0 или 2.0

Введение

С помощью модуля переопределения URL-адресов и маршрутизации запросов приложений можно реализовать сложные и гибкие конфигурации балансировки нагрузки и обратного прокси-сервера. Очень распространенный сценарий обратного прокси-сервера — сделать несколько внутренних веб-приложений доступными через Интернет. Веб-сервер, доступный через Интернет, используется в качестве сервера обратного прокси-сервера, который получает веб-запросы, а затем пересылает их нескольким приложениям интрасети для обработки. На следующем рисунке показана типичная конфигурация для сценария обратного прокси-сервера:

Схема типичной конфигурации для сценария обратного прокси-сервера.

При условии, что сервер ARR имеет доменное имя http://contoso.com, каждое веб-приложение можно получить с помощью следующих URL-адресов:

  • http://contoso.com/webmail/
  • http://contoso.com/payroll/

Когда выполняется запрос к http://contoso.com/webmail/default.aspx, ARR перенаправит эти запросы на внутренний сервер, используя URL-адрес http://webmail/default.aspx. Аналогичным образом запросы к http://contoso.com/payroll/ перенаправляются в http://payroll/default.aspx.

Кроме того, если внутреннее приложение вставляет ссылки в HTML-код ответа, которые ссылаются на другие части этих приложений, эти ссылки следует изменить до возврата ответа клиенту. Например, страница из http://webmail/default.aspx может содержать такую ссылку:

<a href="/default.aspx?id=1">link</a>

Затем сервер ARR должен изменить эту ссылку на следующую:

<a href="/webmail/default.aspx?id=1">link</a>

Создание примеров веб-сайтов

Для простоты сценарий обратного прокси-сервера, с которым вы будете работать в этом пошаговом руководстве, будет реализован на одном сервере, при этом iis "веб-сайт по умолчанию" выступает в качестве сайта обратного прокси-сервера, а приложения веб-почты и зарплаты размещены на разных веб-сайтах IIS на одном сервере.

Чтобы создать примеры веб-сайтов, выполните следующие действия.

  1. Создайте две папки с именами "webmail" и "payroll" в следующей папке:

    %SystemDrive%\inetpub\ folder.
    
  2. Создайте два веб-сайта IIS с именами "webmail" и "payroll", которые указывают на соответствующие папки в разделе %SystemDrive%\inetpub\. Используйте разные IP-порты для каждого сайта.
    Для создания сайтов можно использовать следующие команды:

    %windir%\System32\inetsrv\appcmd.exe add site /name:"webmail" /bindings:http/*:8081: /physicalPath:"%SystemDrive%\inetpub\webmail"
    
    %windir%\System32\inetsrv\appcmd.exe add site /name:"payroll" /bindings:http/*:8082: /physicalPath:"%SystemDrive%\inetpub\payroll"
    
  3. Создайте файл с именем default.aspx в следующей папке:

    %SystemDrive%\inetpub\webmail
    
  4. Скопируйте следующую разметку ASP.NET, вставьте ее в файл и сохраните файл:

    <%@ Page Language="C#" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Reverse Proxy Test - WebMail Application</title>
    </head>
    <body>
        <h1>Reverse Proxy Test Page - WebMail Application</h1>
        <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %><p>
        <p><a href="<%= Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p>
    </body>
    </html>
    
  5. Создайте файл с именем default.aspx в следующей папке:

    %SystemDrive%\inetpub\payroll
    
  6. Скопируйте следующую разметку ASP.NET, вставьте ее в файл и сохраните файл:

    <%@ Page Language="C#" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Reverse Proxy Test - Payroll Application</title>
    </head>
    <body>
        <h1>Reverse Proxy Test Page - Payroll Application</h1>
        <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %><p>
        <p><a href="<%= Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p>
    </body>
    </html>
    
  7. Чтобы убедиться, что сайты работают правильно, откройте веб-страницу и запросите следующие URL-адреса:

    http://localhost:8081/default.aspx
    
    http://localhost:8082/default.aspx
    

Настройка правил для обратного прокси-сервера

В этом разделе пошагового руководства вы настроите функции обратного прокси-сервера для работы с созданными примерами веб-сайтов.

Включение функции обратного прокси-сервера

Функция обратного прокси-сервера отключена по умолчанию, поэтому ее необходимо начать с включения.

  1. Открытие диспетчера IIS
  2. Выберите узел сервера в представлении в виде дерева слева и щелкните функцию "Маршрутизация запросов приложений".
    Снимок экрана: диспетчер I I S. Отображаются различные значки. Выделен значок маршрутизации запросов приложений.
  3. Установите флажок "Включить прокси-сервер" проверка. Оставьте значения по умолчанию для всех остальных параметров на этой странице:
    Снимок экрана: страница

Создание правила для приложения веб-почты

Вы создадите два правила перезаписи:

  • Правило переопределения, которое будет выполнять прокси-запрос к приложению webmail при http://localhost:8081/ условии, что запрошенный URL-путь начинается с "webmail".
  • Правило перезаписи, которое будет выполнять прокси-запрос к приложению для расчета заработной платы до http://localhost:8082/ тех пор, пока запрошенный URL-адрес начинается с "payroll".

Чтобы добавить правила перезаписи обратного прокси-сервера, выполните следующие действия.

  1. Откройте файлweb.config , расположенный в следующем расположении:

    %SystemDrive%\inetpub\wwwroot\
    
  2. В элементе /configuration/system.webServer добавьте следующее, а затем сохраните файл:

    <rewrite>
        <rules>
            <rule name="Reverse Proxy to webmail" stopProcessing="true">
                <match url="^webmail/(.*)" />
                <action type="Rewrite" url="http://localhost:8081/{R:1}" />
            </rule>
            <rule name="Reverse Proxy to payroll" stopProcessing="true">
                <match url="^payroll/(.*)" />
                <action type="Rewrite" url="http://localhost:8082/{R:1}" />
            </rule>
        </rules>
    </rewrite>
    

Дополнительные сведения о создании правил перезаписи см. в статье Создание правил переопределения для модуля переопределения URL-адресов.

Тестирование функции обратного прокси-сервера

Откройте веб-браузер и отправьте запрос к http://localhost/webmail/default.aspx. Вы должны увидеть ответ на тестовой странице веб-почты. Кроме того, сделайте запрос к http://localhost/payroll/default.aspx. Вы должны увидеть ответ на странице тестирования заработной платы.

Снимок экрана: приложение веб-почты тестовой страницы обратного прокси-сервера. В нижней части выделена косая черта локальной косой черты локальной косой черты узла по умолчанию точка s p x.

Обратите внимание, что в обоих случаях ссылка внутри ответа указывает на http://localhost/default.aspx. Если щелкнуть эту ссылку, сервер получит ответ 404 (файл не найден). В следующем разделе вы узнаете, как создать правило для исходящего трафика для исправления связей HTML-кода ответа, созданного приложением.

Настройка правил для перезаписи ответов

Этот раздел документации относится к модулю переопределения URL-адресов версии 2.0 для IIS 7.

Вы определите правило для исходящего трафика, которое заменит все ссылки в HTML-коде ответа следующим образом:

<a href="/default.aspx">...</a>

будет заменен на:

<a href="/webmail/default.aspx">...</a>

(если ответ получен из приложения веб-почты)

и

<a href="/payroll/default.aspx">...</a>

(если ответ получен из приложения для расчета заработной платы)

Предупреждение

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

<action type="Rewrite" value="{HtmlEncode:{HTTP_REFERER}}" />

Чтобы создать правило, выполните следующие действия.

  1. Перейти к диспетчеру IIS
  2. Выберите "Веб-сайт по умолчанию"
  3. В представлении функций щелкните "Переопределение URL-адреса".
    Снимок экрана: диспетчер I I S. На панели Подключения отображается развернутое дерево навигации. Выделен веб-сайт по умолчанию. В области Главная веб-сайта по умолчанию выбран значок перезаписи U R L.
  4. В области Действия справа щелкните "Добавить правила...". В диалоговом окне "Добавление правил" выберите "Пустое правило" в категории "Правила для исходящего трафика" и нажмите кнопку ОК:
    Снимок экрана: диалоговое окно добавления правила. Выбрано пустое правило в категории Правила для исходящего трафика. Добавление правил в области Действия выделено.

Теперь необходимо определить фактическое правило для исходящего трафика. В модуле переопределения URL-адресов 2.0 правило перезаписи исходящего трафика определяется путем указания следующих сведений:

  • Имя правила.
  • Необязательное условие, определяющее, следует ли применять это правило к ответу.
  • Шаблон, используемый для сопоставления строки в ответе.
  • Необязательный набор условий.
  • Действие, выполняемое при совпадении шаблона и успешном выполнении всех проверок условий.

Именование правила

В текстовом поле "Имя" введите имя, которое будет однозначно определять правило, например"Добавить префикс приложения".

Определение условия

Предварительное условие используется для оценки того, следует ли выполнять оценку правил для исходящего трафика в ответе. Например, если правило изменяет html-содержимое, следует оценивать только HTTP-ответы с заголовком типа контента, для которого задано значение "text/html". Оценка исходящих правил и перезапись содержимого — это ресурсоемкая операция, которая может негативно повлиять на производительность веб-приложения. Поэтому используйте предварительные условия, чтобы сузить случаи применения правил исходящего трафика.

Так как создаваемое правило должно применяться только к HTML-ответам, вы определите условие, которое проверяет, эквивалентен ли тип содержимого заголовка HTTP-ответа "text/html".

Чтобы определить условие, выполните следующие действия.

  1. В списке Предварительные условия выберите "<Создать новое предварительное условие...>".

  2. Откроется диалоговое окно редактора предварительных условий, где необходимо определить условие. Укажите параметры предварительных условий следующим образом:

    • Имя: "IsHTML"

    • Использование регулярных выражений

    • Нажмите кнопку "Добавить", чтобы открыть диалоговое окно "Добавить условие". В этом диалоговом окне укажите:

      • Входные данные условия: "{RESPONSE_CONTENT_TYPE}"

      • Проверьте, соответствует ли входная строка : "Соответствует шаблону"

      • Шаблон: "^text/html"

        Снимок экрана: диалоговое окно

  3. Нажмите кнопку ОК, чтобы сохранить предварительное условие и вернуться на страницу "Изменение правила".

Определение соответствующего область

Правило перезаписи для исходящего трафика может работать с содержимым заголовка HTTP или с содержимым текста ответа. Это правило должно заменить ссылки в содержимом ответа, поэтому в раскрывающемся списке "Область сопоставления" выберите "Ответ".

Определение фильтра тегов

Фильтры тегов используются для область сопоставления шаблонов только с определенными элементами HTML, а не для оценки всего ответа по шаблону правила. Сопоставление шаблонов — это очень ресурсоемкая операция, и если весь ответ вычисляется по шаблону, это может значительно замедлить время отклика веб-приложения. Фильтры тегов позволяют указать, что сопоставление шаблонов должно применяться только в содержимом определенных html-тегов, что значительно сокращает объем данных, которые необходимо оценить по шаблону регулярного выражения.

Чтобы определить фильтр тегов, разверните раскрывающийся список "Соответствие содержимого в: ", а затем выберите и проверка поле проверка "A (атрибут href)".

Это задает правило для применения шаблона только к значению атрибута href гиперссылки, как показано в следующем примере:

<a href="this string will be used for pattern matching">Some link</a>

Определение шаблона

В текстовом поле "Шаблон" введите следующую строку:

^/(.*)

Эта строка является регулярным выражением, которое указывает, что шаблон будет соответствовать любой строке URL-пути, начинающейся с символа "/".

Обратите внимание на использование круглых скобок в шаблоне. Эти круглые скобки создают группу отслеживания, на которую позже можно ссылаться в правиле с помощью обратных ссылок.

Определение условия

Вам нужно изменять ссылки в HTML-коде ответа, только если ответ получен из веб-почты или приложения для расчета заработной платы. Чтобы проверка, что вы будете использовать условие, которое анализирует путь URL-адреса, запрошенный клиентом. Кроме того, вы определите шаблон условия, который записывает папку приложения из запрошенного URL-адреса, чтобы правило могло повторно использовать его при перезаписи ссылок в ответе.

  1. Разверните поле группы условия.
  2. Нажмите кнопку "Добавить..." чтобы открыть диалоговое окно для определения условий.
  3. Для параметра "Condition input:" введите эту строку: "{URL}". Модуль переопределения URL-адресов настраивается для использования URL-пути, запрошенного веб-клиентом.
  4. В раскрывающемся списке выберите "Соответствует шаблону".
  5. Введите ^/(webmail|payroll)/.* в текстовое поле Шаблон . Это регулярное выражение используется для сопоставления URL-путей, которые начинаются с /webmail или /payroll. Круглые скобки в шаблоне захватывают часть совпадающей строки URL-адреса, чтобы ее можно было использовать при создании замещающего URL-адреса.
  6. Нажмите кнопку ОК, чтобы сохранить условие и вернуться к пользовательскому интерфейсу "Добавить правило".

Определение действия

Выберите тип действия "Перезаписать", указанный в поле группы "Действие". В текстовом поле "Значение" введите следующую строку:

/{C:1}/{R:1}

Эта строка задает новое значение, на которое необходимо переписать адрес ссылки. {C:1} является обратной ссылкой на группу отслеживания шаблонов условий, и она будет заменена строками "webmail" или "payroll". {R:1} является обратной ссылкой на группу отслеживания шаблонов правил, и в этом конкретном случае она будет заменена исходным URL-путем, который использовался в гиперссылке.

Оставьте значения по умолчанию для всех остальных параметров. Страница свойств "Изменить правило исходящего трафика" должна выглядеть следующим образом:

Снимок экрана: страница свойств

Сохраните правило, щелкнув действие "Применить" справа.

Чтобы проверка конфигурацию только что созданных правил, откройте файл web.config, расположенный в %SystemDrive%\inetput\wwwroot\. В этом файле вы увидите <rewrite> раздел, содержащий это определение правила:

<rewrite>
    <rules>
        <rule name="Reverse Proxy to webmail" stopProcessing="true">
            <match url="^webmail/(.*)" />
            <action type="Rewrite" url="http://localhost:8081/{R:1}" />
        </rule>
        <rule name="Reverse Proxy to payroll" stopProcessing="true">
            <match url="^payroll/(.*)" />
            <action type="Rewrite" url="http://localhost:8082/{R:1}" />
        </rule>
    </rules>
    <outboundRules>
        <rule name="Add application prefix" preCondition="IsHTML">
            <match filterByTags="A" pattern="^/(.*)" />
            <conditions>
                <add input="{URL}" pattern="^/(webmail|payroll)/.*" />
            </conditions>
            <action type="Rewrite" value="/{C:1}/{R:1}" />
        </rule>
        <preConditions>
            <preCondition name="IsHTML">
                <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
            </preCondition>
        </preConditions>
    </outboundRules>
</rewrite>

Тестирование правила

Чтобы проверить, правильно ли правило перезаписывает URL-адреса в ответе, откройте веб-браузер и отправьте запрос к http://localhost/webmail/default.aspx или http://localhost/payroll/default.aspx. Вы увидите, что правило перезаписи для исходящего трафика изменило ссылку в HTML-ответе:

Снимок экрана: приложение веб-почты тестовой страницы обратного прокси-сервера. Ссылка в нижней части — h t t p двоеточие косой черты косой черты локального узла косой черты веб-почты по умолчанию точка s p x.

Итоги

В этом пошаговом руководстве вы узнали, как настроить модуль перезаписи URL-адресов и маршрутизацию запросов приложений для реализации сценария обратного прокси-сервера. Кроме того, вы узнали, как использовать новую функцию исходящего перезаписи модуля переопределения URL-адресов 2.0 для исправления ссылок в ответах приложений перед их обслуживанием веб-клиенту.

Обратите внимание, что при использовании обратного прокси-сервера часто также требуется перезаписать заголовки HTTP-ответа. Сведения о том, как использовать модуль переопределения URL-адресов 2.0 для изменения заголовка HTTP ответа, см. в статье Изменение заголовков ответа HTTP.