Creating Rewrite Rules for the URL Rewrite Module (Создание правил переопределения для модуля переопределения URL-адресов).
Модуль переопределения URL-адресов — это расширение служб IIS, доступное для скачивания для автономного сервера IIS, а также предварительно установленное на любом веб-сайте веб-сайтов Windows Azure (WAWS) и доступное для использования. В этом пошаговом руководстве описано, как создать и проверить набор правил перезаписи для модуля переопределения URL-адресов.
Предварительные требования
Для этого пошагового руководства требуются следующие предварительные требования:
- IIS 7 или более поздней версии с включенной службой ASP.NET роли.
- Установленный модуль переопределения URL-адресов. Дополнительные сведения см. в разделе Использование модуля переопределения URL-адресов.
Настройка тестовой веб-страницы
Чтобы продемонстрировать, как работает модуль переопределения URL-адресов, мы будем использовать простую тестовую страницу ASP.NET. Эта страница считывает переменные веб-сервера и выводит их значения в браузере.
Скопируйте следующий код ASP.NET и поместите его в папку %SystemDrive%\inetpub\wwwroot\ в файле article.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 Test</title>
</head>
<body>
<h1>URL Rewrite Module Test Page</h1>
<table>
<tr>
<th>Server Variable</th>
<th>Value</th>
</tr>
<tr>
<td>Original URL: </td>
<td><%= Request.ServerVariables["HTTP_X_ORIGINAL_URL"] %></td>
</tr>
<tr>
<td>Final URL: </td>
<td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
</tr>
</table>
</body>
</html>
После копирования этого файла перейдите по адресу http://localhost/article.aspx
и проверка, что страница была правильно отображена в браузере.
Создание правила перезаписи
Мы создадим простое правило перезаписи, которое будет переписывать URL-адреса в следующем формате:
http://localhost/article/342/some-article-title
на:
http://localhost/article.aspx?id=342&title=some-article-title
.
Мы создадим правило перезаписи с помощью пользовательского интерфейса переопределения URL-адресов в диспетчере IIS. Для этого выполните следующие действия:
- Перейдите в диспетчер IIS.
- Выберите Веб-сайт по умолчанию.
- В представлении функций щелкните Переопределение URL-адреса.
- В области Действия справа щелкните Добавить правила...
- В диалоговом окне Добавление правил выберите Пустое правило и нажмите кнопку ОК.
Теперь необходимо определить фактическое правило перезаписи. В модуле переопределения URL-адресов правило переопределения определяется путем указания четырех обязательных фрагментов информации:
- Имя правила.
- Шаблон, используемый для сопоставления строки URL-адреса.
- Необязательный набор условий.
- Действие, выполняемое при совпадении шаблона и успешность проверки всех условий.
Именование правила
В текстовом поле Имя введите имя, которое будет однозначно идентифицировать правило, например "Переписать в article.aspx".
Определение шаблона
В текстовом поле Шаблон введите следующую строку:
^article/([0-9]+)/([_0-9a-z-]+)
Эта строка является регулярным выражением, которое указывает, что шаблон будет соответствовать любой строке URL-адреса, удовлетворяющей следующим условиям:
- Начинается с последовательности символов "article/".
- Содержит один или несколько числовых символов после первого "/".
- Содержит один или несколько буквенно-цифровых символов или "_" или "-" после второго "/".
Обратите внимание, что определенные части регулярного выражения находятся в круглых скобках. Эти круглые скобки создают группы записи, на которые позже можно ссылаться в правиле с помощью обратных ссылок.
Определение действия
Так как создаваемое правило должно переписать URL-адрес, выберите тип действия Перезаписать , указанный в поле Группа действий . В текстовом поле Переписать URL-адрес: введите следующую строку:
article.aspx?id={R:1}&title={R:2}
Эта строка задает новое значение, на которое необходимо переписать входной URL-адрес. Обратите внимание, что для значений параметров строки запроса мы использовали {R:1} и {R:2}, которые являются обратными ссылками на группы отслеживания, определенные в шаблоне правила с помощью круглых скобок.
Оставьте значения по умолчанию для всех остальных параметров. Страница свойства Edit InBound Rule (Изменение правила входящего трафика ) должна выглядеть следующим образом:
Сохраните правило, нажав кнопку Применить справа.
Просмотр правила перезаписи в файле конфигурации
Правила перезаписи хранятся в файле ApplicationHost.config или в файлах Web.config. Чтобы проверка конфигурацию только что созданного правила, откройте файл Web.config, расположенный в папке %SystemDrive%\inetpub\wwwroot. В этом файле вы увидите <rewrite>
раздел, содержащий это определение правила:
<rewrite>
<rules>
<rule name="Rewrite to article.aspx">
<match url="^article/([0-9]+)/([_0-9a-z-]+)" />
<action type="Rewrite" url="article.aspx?id={R:1}&title={R:2}" />
</rule>
</rules>
</rewrite>
Приведенный выше синтаксис также применяется к настройке перезаписи URL-адресов в Web.config на веб-сайтах Windows Azure (WAWS).
Тестирование правила перезаписи
Чтобы проверить правильность перезаписи URL-адресов правилом, откройте веб-браузер и запросите следующий URL-адрес:
http://localhost/article/234/some-title
Вы увидите, что правило перезаписи на веб-сервере изменило исходный URL-адрес на Article.aspx и передало "234" и "some-title" в качестве значений для параметров строки запроса.
Создание правила перенаправления
Теперь мы создадим правило перенаправления, которое будет перенаправлять все URL-адреса в следующем формате:
http://localhost/blog/some-other-title/543
в следующем формате:
http://localhost/article/543/some-other-title
Правило перенаправления позволяет нескольким URL-адресам указывать на одну веб-страницу.
Для этого откройте пользовательский интерфейс представления функции переопределения URL-адресов в диспетчере IIS. Щелкните Добавить правило..., а затем снова выберите шаблон Пустое правило .
На странице Изменение правила введите следующее:
- Имя: перенаправление из блога (это уникальное имя правила).
- Шаблон: ^blog/([_0-9a-z-]+)/([0-9]+) (Этот шаблон будет соответствовать строке URL-адреса, которая начинается с "blog" и записывает второй и третий сегменты URL-адреса в back-references.)
- Действие: перенаправление (действие перенаправления приведет к отправке ответа перенаправления обратно в браузер.)
- URL-адрес перенаправления: article/{R:2}/{R:1} (эта строка подстановки будет использоваться в качестве URL-адреса перенаправления. Обратите внимание, что в ней используются обратные ссылки для сохранения и изменения исходного URL-адреса, захваченного во время сопоставления шаблонов.)
Введите имя, шаблон и действие, как показано ниже:
Введите URL-адрес перенаправления, как показано ниже:
Оставьте значения по умолчанию для всех остальных параметров. Сохраните правило, нажав кнопку Применить справа.
Тестирование правила перенаправления
Чтобы проверить правильность перенаправления запросов правилом, откройте веб-браузер и запросите следующий URL-адрес:
http://localhost/blog/some-other-title/323
Вы увидите, что браузер был перенаправлен http://localhost/article/323/some-other-title
в результате выполнения правила перенаправления, а затем запрос был перезаписан в соответствии с правилом перезаписи, созданным ранее.
Создание правила блокировки доступа
Третье правило, которое мы создадим, используется для блокировки всех запросов к веб-сайту, если для этих запросов не задан заголовок узла. Этот тип правила полезен, если вы хотите предотвратить попытки взлома, которые выполняются путем отправки HTTP-запросов к IP-адресу сервера вместо использования имени узла.
Мы создадим это правило без использования диспетчера IIS. Откройте файл Web.config в папке %SystemDrive%\inetpub\wwwroot\
, которая использовалась для тестового файла article.aspx в начале этой статьи. Найдите раздел <rewrite>
. Вставьте следующее правило в коллекцию <rules> , чтобы оно было первым правилом в коллекции:
<rule name="Fail bad requests">
<match url=".*"/>
<conditions>
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
</conditions>
<action type="AbortRequest" />
</rule>
Раздел <rewrite>
должен выглядеть следующим образом:
<rewrite>
<rules>
<rule name="Fail bad requests">
<match url=".*"/>
<conditions>
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
</conditions>
<action type="AbortRequest" />
</rule>
<rule name="Redirect from blog">
<match url="^blog/([_0-9a-z-]+)/([0-9]+)" />
<action type="Redirect" url="article/{R:2}/{R:1}" redirectType="Found" />
</rule>
<rule name="Rewrite to article.aspx">
<match url="^article/([0-9]+)/([_0-9a-z-]+)" />
<action type="Rewrite" url="article.aspx?id={R:1}&title={R:2}" />
</rule>
</rules>
</rewrite>
Давайте проанализируем правило, чтобы понять, что оно делает.
<match url=".*"/>
В приведенном выше элементе указано, что правило будет соответствовать любой строке URL-адреса.
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
Элемент выше добавляет условие к правилу, которое получает значение заголовка узла путем считывания переменной сервера HTTP_HOST, сопоставляет ее с шаблоном localhost, а затем отрицает результат сопоставления. Иными словами, условие проверяет, что заголовок узла не соответствует "localhost".
<action type="AbortRequest" />
Элемент выше сообщает модулю переопределения URL-адресов завершить HTTP-запрос.
Тестирование правила блокировки доступа
Чтобы проверить это правило, откройте веб-браузер и отправьте запрос к http://127.0.0.1/article/234/some-title
. Вы должны увидеть браузер, который не получает никакого ответа от сервера. Однако при запросе http://localhost/article/234/some-title
веб-сервер успешно ответит.
Неуспешное отображение будет следующим:
Успешное отображение будет следующим:
Итоги
В этом пошаговом руководстве вы узнали, как настроить правила перезаписи URL-адресов с помощью диспетчера IIS или вручную изменить Web.config файлы. Правила, созданные в этом пошаговом руководстве, продемонстрировали некоторые важные функции модуля переопределения URL-адресов, такие как поддержка регулярных выражений и возможность использовать заголовки HTTP и переменные сервера для принятия решений о перезаписи.