Создание правил для исходящего трафика для модуля переопределения URL-адресов

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

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

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

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

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

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

Настройка тестовой веб-страницы

Чтобы продемонстрировать, как работает модуль 2 переопределения URL-адресов, используйте простую страницу ASP.NET. Эта страница считывает переменные веб-сервера и отображает их значения в браузере. Он также создает гиперссылку с помощью переменных сервера, а затем помещает ее в HTML-код ответа.

Создание тестовой страницы

  1. Создайте файл с именем article.aspx в следующей папке:

    %SystemDrive%\inetpub\wwwroot\
    
  2. Скопируйте следующую разметку 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>URL Rewrite Module v2 Test</title>
    </head>
    <body>
        <h1>URL Rewrite Module v2 Test Page</h1>
        <h2>Inbound URL Rewriting</h2>
        <table>
            <tr>
                <th>Server Variable</th>
                <th>Value</th>
            </tr>
            <tr>
                <td>Original URL: </td>
                <td><%= Request.ServerVariables["UNENCODED_URL"] %></td>
            </tr>
            <tr>
                <td>Final URL: </td>
                <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
            </tr>
        </table>
        <h2>Outbound URL Rewriting</h2>
            <a href="<%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %>">Here</a> is the link to this article.
    </body>
    </html>
    
  3. Откройте веб-браузер и запросите следующий URL-адрес, чтобы убедиться, что страница отображается правильно:

    http://localhost/article.aspx
    

Добавление правила переопределения входящего трафика

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

http://localhost/article/342/some-article-title

Эти URL-адреса будут переписаны в следующий формат:

http://localhost/article.aspx?id=342&title=some-article-title

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

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

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

    <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}&amp;title={R:2}" />
        </rule>
      </rules>
    </rewrite>
    

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

Тестирование правила перезаписи для входящего трафика

Теперь можно проверить, работает ли правило перезаписи для входящего трафика.

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

Откройте веб-браузер и запросите следующий URL-адрес:

http://localhost/article/342/some-article-title

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

Снимок экрана: окончательный URL-адрес после наведенного указателя мыши на ссылку на странице теста модуля переопределения URL-адреса с помощью веб-браузера.

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

  1. Посетители веб-сайта увидят внутреннюю структуру URL-адресов, которую вы хотите скрыть с помощью правила переопределения URL-адресов.
  2. Та же страница будет доступна по нескольким URL-адресам, что не идеально подходит для поисковой оптимизации.

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

В этом случае может помочь перезапись исходящего URL-адреса. Перезапись исходящего URL-адреса может исправлять ссылки на лету в ответе, созданном приложением.

Создание правила перезаписи для исходящего трафика

Теперь вы создадите правило перезаписи для исходящего трафика, которое изменяет URL-адреса в HTML-ответах. Правило изменит URL-адреса в следующем формате:

http://localhost/article.aspx?id=342&title=some-article-title

Эти URL-адреса будут переписаны следующим образом:

http://localhost/article/342/some-article-title

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

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

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

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

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

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

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

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

Предварительное условие используется для оценки того, следует ли выполнять оценку правил для исходящего трафика в ответе. Например, если правило изменяет 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>

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

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

^/article\.aspx\?id=([0-9]+)(?:&|&amp;)title=([_0-9a-z-]+)$

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

  • Начинается с последовательности символов "/article.aspx?".
  • Содержит первый параметр строки запроса, имеющий числовое значение.
  • Содержит второй параметр строки запроса, имеющий буквенно-цифровое значение.

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

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

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

/article/{R:1}/{R:2}

Эта строка указывает новое значение, на которое необходимо переписать адрес ссылки. Обратите внимание, что для значений параметров строки запроса выражение использует {R:1} и {R:2}, которые являются обратными ссылками на группы отслеживания, определенные в шаблоне правила с помощью круглых скобок.

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

Снимок экрана перед применением нового правила перезаписи исходящего трафика с предварительным условием Is H T M L

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

Просмотр правила перезаписи в файле конфигурации

Правила перезаписи хранятся либо в файлеaplicationHost.config , либо в файлахweb.config . Чтобы проверка конфигурацию только что созданного правила, откройте файл web.config, расположенный в

%SystemDrive%\inetput\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}&amp;title={R:2}" />
  </rule>
 </rules>
 <outboundRules>
  <rule name="Rewrite to clean URL" preCondition="IsHTML">
   <match filterByTags="A" pattern="^/article\.aspx\?id=([0-9]+)(?:&amp;|&amp;amp;)title=([_0-9a-z-]+)$" />
   <action type="Rewrite" value="/article/{R:1}/{R:2}" />
  </rule>
  <preConditions>
   <preCondition name="IsHTML">
    <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
   </preCondition>
  </preConditions>
 </outboundRules>
</rewrite>

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

Теперь можно проверить, правильно ли правило перезаписывает URL-адреса. Откройте веб-браузер и запросите следующий URL-адрес:

http://localhost/article/342/some-article-title

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

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

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

Сводка

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