Настройка заголовков HTTP-запросов и переменных сервера IIS

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

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

В этом пошаговом руководстве описано, как использовать модуль перезаписи URL-адресов версии 2.0 для задания заголовков HTTP-запросов и переменных сервера IIS.

Необходимые условия

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

  1. IIS 7.0 или более поздней версии с включенной службой ролей ASP.NET
  2. Установлен модуль переопределения URL-адресов 2.0

Настройка пошагового сценария

Чтобы продемонстрировать, как использовать модуль переопределения URL-адресов 2.0 для задания заголовков HTTP и переменных сервера IIS, мы реализуем сценарий, в котором заголовок HTTP Cookie в запросе устанавливается на основе запрошенного URL-адреса. Например, предположим, что у вас есть веб-приложение, которое обслуживает локализованные веб-страницы. Веб-приложение определяет язык ответа на основе HTTP-файла cookie в запросе. Проблема с этим подходом заключается в том, что поисковые системы не индексируют локализованное содержимое этого приложения, так как поисковые системы не используют HTTP-файлы cookie, поэтому только содержимое на языке по умолчанию будет обслуживаться веб-приложением. Чтобы устранить эту проблему, вы решите добавить сведения о языке в рамках URL-адреса, например, http://www.contoso.com/default.aspxа затем используйте модуль перезаписи URL-адресов 2.0, чтобы задать файл cookie, который веб-приложение ожидает, чтобы определить язык ответа. Кроме того, необходимо задать другую переменную сервера с именем ORIGINAL_URI , которая будет содержать исходно запрошенную строку URI.

Чтобы настроить сценарий пошагового руководства, скопируйте следующий код ASP.NET и поместите его в папку %SystemDrive%\inetpub\wwwroot\ в файл с именем language.aspx:

<%@ 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>URL Rewrite Module v2 Test - Setting Server Variables</title>
</head>
<body>
 <h1>Setting HTTP request header and a server variable with URL Rewrite Module v2</h1>
 <p>The value of the Language cookie is <strong><%=( Request.Cookies["Language"] != null ) ? Request.Cookies["Language"].Value : "Cookie not set" %></strong></p>
 <p>The originally requested URI is <strong><%= HttpUtility.HtmlEncode( Request.ServerVariables["ORIGINAL_URI"] ) %></strong></p>
</body>
</html>

После копирования этого файла перейдите к http://localhost/language.aspx, затем проверьте правильность отображения страницы в браузере.

Создание правила перезаписи

Вы создадите правило перезаписи, которое перезаписывает URL-адреса с помощью следующего формата:

http://localhost/<language>/anyfile.aspx
будет перезаписан следующим образом:
http://localhost/anyfile.aspx

Правило перезаписи также задает две переменные сервера IIS:

  • HTTP_COOKIE
  • ORIGINAL_URI

Вы создадите правило перезаписи с помощью пользовательского интерфейса переопределения URL-адресов в диспетчере IIS.

Откройте диспетчер IIS, выберите "Веб-сайт по умолчанию" в представлении дерева слева и откройте функцию перезаписи URL-адресов:

Снимок экрана: начальный экран веб-сайта по умолчанию для I S Manager с фокусом на параметре перезаписи U R L.

Разрешение изменения переменных сервера

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

  • HTTP_COOKIE
  • ORIGINAL_URI

Замечание

Список разрешенных переменных сервера не применим к глобальным правилам, определенным на уровне сервера. Не обязательно добавить переменную сервера в список "Разрешено", если эта переменная сервера задана с помощью глобального правила перезаписи.

Выберите "Просмотр переменных сервера..." действие из области "Действия":

Снимок экрана: экран перезаписи U R L с фокусом на параметре

Используйте действие "Добавить..." для добавления переменных сервера HTTP_COOKIE и ORIGINAL_URI в список разрешенных переменных сервера:

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

После обновления списка разрешенных переменных сервера нажмите кнопку "Назад к правилам", чтобы вернуться к представлению списка правил.

Определение карты перезаписи

Следующий шаг — определить карту перезаписи, которая будет использоваться для сопоставления URL-части, представляющей язык с идентификатором языкового стандарта, который будет сохранен правилом перезаписи в заголовок файла cookie HTTP.

В области "Действия" выберите действие "Просмотр карт перезаписи..."

Снимок экрана: экран перезаписи U R L с фокусом на параметре

Нажмите кнопку "Добавить карту перезаписи..." и укажите имя карты как "Языки":

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

Эта карта определяет сопоставления между частью URL, представляющей язык, и идентификатором языкового стандарта, который будет использоваться при установке файла cookie HTTP-запроса. Чтобы указать значение по умолчанию, используемое при отсутствии сопоставления, нажмите действие "Изменить параметры карты...". Введите "en_US" в качестве значения по умолчанию:

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

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

Исходное значение: Новое значение:
fr-fr fr_FR
de-de de_DE
ru-ru ru_RU

Определение правила перезаписи

Наконец, вы создадите правило перезаписи, которое задает переменные сервера с помощью карты перезаписи, определенной ранее.

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

Снимок экрана: экран

  • Имя правила: "задать переменные сервера"

  • Запрошенный URL-адрес: "Соответствует шаблону"

  • Использование: "Регулярные выражения"

  • Шаблон: "^([a-z]{2}-[a-z]{2})/(.*)"

  • Условия:

    • Входные данные: "{Языки:{R:1}}
    • Тип: "Соответствует шаблонам"
    • Шаблон: "(.+)"
  • Действие:

    • Тип: "Переписать"
    • Переопределение URL-адреса: "{R:2}"

Шаблон правила соответствует любому URL-пути, который содержит языковой сегмент (например, http://www.contoso.com/de-de/default.aspx). Он также записывает сегмент языка и оставшуюся часть пути URL-адреса в обратных ссылках на правило, чтобы их можно было повторно использовать позже в правиле. Условие правила использует ранее захваченный сегмент языка в качестве ключа поиска, передаваемого в карту переписывания "Языки". Результат поиска карты хранится в обратной ссылке условия. Действие правила перезаписывает URL-адрес так, чтобы он не содержал сегмент языка.

Разверните раздел "Переменные сервера..." и укажите значения, используемые для задания переменных сервера:

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

  • Имя: HTTP_COOKIE, значение: Language={C:1}
  • Имя: ORIGINAL_URI, значение: http://{HTTP_HOST}{REQUEST_URI}

Файл cookie HTTP устанавливается с использованием обратной ссылки на условие, которое содержит идентификатор языкового стандарта, полученный из карты правил перезаписи "Languages". Значение переменной сервера ORIGINAL_URI создается с помощью переменных сервера {HTTP_HOST} и {REQUEST_URI}.

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

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

Чтобы проверить правильное определение файла cookie и переменной сервера, откройте веб-браузер и запросите следующий URL-адрес:

http://localhost/fr-fr/language.aspx

Снимок экрана тестовой веб-страницы модуля переписывания URL версии 2 с фокусом на строке ввода URL, значение cookie языка установлено на FR_FR.

Вы должны увидеть, что правило перезаписи установило файл cookie "Язык" в соответствии с запрошенным URL-адресом. Кроме того, исходная строка URL-адреса была доступна для страницы ASP.NET через переменную сервера "ORIGINAL_URI".