Поделиться через


Использование глобальных и распределенных правил перезаписи

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

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

Историческая справка

Глобальные правила перезаписи используются для определения логики перезаписи URL-адресов на уровне сервера. Эти правила определяются в applicationHost.config файле и не могут быть переопределены или отключены на более низких уровнях конфигурации, таких как сайт или виртуальный каталог. Глобальные правила всегда работают с абсолютным URL-путем (то есть запрошенным URI без имени сервера). Например, если был сделан запрос к http://localhost/directory1/directory2/index.html, модуль перезаписи URL-адресов передает "directory1/directory2/index.html" в качестве входных данных в глобальное правило.

Правила распределенного перезаписи используются для определения логики перезаписи URL-адресов, относящийся к определенной конфигурации область. Распределенные правила можно определить на любом уровне конфигурации (кроме файла) с помощью web.config файлов. Локальные правила всегда работают с URL-адресами относительно расположения Web.config файла, в котором они определены. Например, если был сделан http://localhost/directory1/directory2/index.html запрос и правило перезаписи определено в Web.config файле, расположенном в каталоге directory1, модуль перезаписи URL-адресов будет передавать "directory2/index.html" в качестве входных данных для этого правила.

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

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

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

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

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

Чтобы продемонстрировать, как использовать глобальные и локальные правила, мы реализуем распространенный сценарий сопоставления поддомов с каталогами. Это позволит нам использовать вложенные домены для доступа к содержимому в разных каталогах на нашем сайте. Например, пользователи смогут переходить http://blog.mysite.comhttp://mysite.com/blogпо вместо или к http://forum.mysite.com вместо http://mysite.com/forum.

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

  1. Создайте в папке две папки с именами "blog" и "forum".%SystemDrive%\inetpub\wwwroot\

  2. Скопируйте следующий код asp.net и поместите его в папку %SystemDrive%\inetpub\wwwroot\blog в файл с именем 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>
          <p>This page is located in blog subdomain.</p>
          <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>
    
  3. Скопируйте следующий код asp.net и поместите его в папку %SystemDrive%\inetpub\wwwroot\forum в файл с именем forum.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>
          <p>This page is located in forum subdomain.</p>
          <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>
    
  4. Откройте файл hosts, расположенный по адресу %SystemDrive%\windows\system32\drivers\etc\ , и добавьте в него две строки:

    127.0.0.1 forum_localhost
    127.0.0.1 blog_localhost
    

    После добавления этих строк откройте веб-браузер, перейдите к http://blog_localhost/blog/article.aspx и в http://forum_localhost/forum/forum.aspx и убедитесь, что страницы были правильно отрисованы в браузере.

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

Сначала мы создадим глобальное правило перезаписи, которое перезаписывает URL-адрес на основе заголовка узла. Например, если был сделан запрос, http://blog_localhost/article.aspx правило изменит путь URL-адреса на "/blog/article.aspx".

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

  1. Перейти к диспетчеру IIS
  2. В представлении дерева навигации выберите узел сервера.
  3. В представлении компонентов щелкните "Модуль переопределения URL-адресов".
    Снимок экрана: домашняя страница WIN two K восемь R T M. Выделен значок перезаписи U R L.
  4. В области "Действия" щелкните "Добавить правила..."
    Снимок экрана: страница перезаписи U R L. В области Действия выделен пункт Добавить правила.
  5. В диалоговом окне "Добавление правил" выберите "Пустое правило" и нажмите кнопку "ОК".
    Снимок экрана: диалоговое окно

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

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

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

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

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

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

(.*)

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

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

Нажмите кнопку "Добавить условия":

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

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

Снимок экрана: страница
Для параметра "Condition input:" введите эту строку: "{HTTP_HOST}". Модуль переопределения URL-адресов настраивается для использования значения заголовка узла HTTP-запроса в качестве входных данных для условия.

В раскрывающемся списке выберите "Соответствует шаблону".

В текстовом поле "Шаблон" введите "^([^_]+)_[^_]+". Это регулярное выражение будет использоваться для сопоставления созданных доменов (blog_localhost и forum_localhost) и будет записывать часть строки перед символом "_" в обратную ссылку. Например, для строки "blog_localhost", она будет хранить "blog" в обратной ссылке.

После указания всех свойств диалоговое окно условия должно выглядеть следующим образом:

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

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

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

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

{C:1}/{R:1}

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

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

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

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

Чтобы понять, как будет применяться это правило, давайте рассмотрим действия, выполняемые модулем переопределения URL-адресов, когда HTTP-клиент запрашивает этот URL-адрес:
http://blog_localhost/article.aspx?id=323:

  1. Модуль переопределения URL-адресов передает "article.aspx?id=323" в качестве входного URL-адреса в правило, успешно сопоставляет его с шаблоном правила и записывает его в обратную ссылку на правило {R:1}
  2. Значение заголовка узла ("blog_localhost") успешно сопоставляется с регулярным выражением "^([^_]+)_[^_]+" и в результате "blog" записывается в условие back-reference {C:1}
  3. В соответствии со строкой подстановки {C:1}/{R:1} URL-адрес перезаписывается на "blog/article.aspx?id=323".

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

Чтобы проверить, правильно ли правило перезаписывает URL-адреса, откройте браузер и запросите следующий URL-адрес:
http://blog_localhost/article.aspx?id=123

Снимок экрана: страница теста модуля переопределения U R L. Отображаются сведения о переменной сервера и значении.

Вы увидите, что модуль переопределения URL-адресов изменил URL-адрес и открыл страницу Article.aspx в каталоге blog. Изменения, внесенные модулем переопределения URL-адресов, основывались на информации, извлеченной из заголовка узла.

Аналогичным образом при запросе http://forum_localhost/forum.aspx?id=345 URL-адрес будет переписан на /forum/forum.aspx?id=345.

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

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

  • Правило перезаписи в папке blog перезаписывает путь URL-адреса со "article/234/some-title" на "article.aspx?id=234&title=some-title".
  • Правило перезаписи в папке forum перезаписывает путь URL-адреса с topic/123/some-topic-title на forum.aspx?topic=some-topic-title&id=123.

Локальные правила можно создавать с помощью диспетчера IIS или путем редактирования web.config файлов. Для демонстрации мы создадим правила, вручную изменив файлы web.config.

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

  1. Создайте пустой файл web.config в %SystemDrive%\inetpub\wwwroot\**blog** папке. Откройте его в текстовом редакторе и вставьте в него следующий XML-код:

    <?xml version="1.0" encoding="UTF-8"?>
    <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>
      </system.webServer>
    </configuration>
    
  2. Создайте пустой файл web.config в %SystemDrive%\inetpub\wwwroot\**forum** папке. Откройте его в текстовом редакторе и вставьте в него следующий XML-код:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <system.webServer>
        <rewrite>
          <rules>
            <rule name="Rewrite to forum.aspx">
              <match url="^topic/([0-9]+)/([_0-9a-z-]+)"/>
              <action type="Rewrite" url="forum.aspx?topic={R:2}&amp;id={R:1}"/>
            </rule>
          </rules>
        </rewrite>
      </system.webServer>
    </configuration>
    

Тестирование как глобальных, так и распределенных правил

Чтобы проверить, правильно ли работают все правила вместе, откройте веб-браузер и отправьте запрос к http://blog_localhost/article/234/some-title. В ответе в браузере должно быть указано, что URL-адрес сначала был изменен глобальным правилом, а затем был дополнительно изменен распределенным правилом.

Аналогичным образом, при запросе http://forum_localhost/topic/123/some-topic-titleвы увидите, что модуль перезаписи URL-адресов изменит запрошенную строку URL-адреса на "/forum/forum.aspx?topic=some-topic-title&id=123".

Снимок экрана: страница теста модуля переопределения U R L. Строка U R L изменилась.

Сводка

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