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

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

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

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

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

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

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

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

Чтобы продемонстрировать, как работает модуль перезаписи URL-адресов 2, вы будете использовать простую страницу 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

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

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

Вы увидите, что из-за правила входящего трафика можно получить доступ к этой веб-странице с помощью простой и понятной структуры 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 Rewrite» на главной странице веб-сайта по умолчанию.
  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>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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