Использование карт переопределения в модуле переопределения URL-адресов

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

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

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

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

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

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

  1. IIS 7.0 или более поздней версии с включенной службой ASP.NET ролей
  2. Установлен выпуск Go Live для перезаписи 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-адресов на основе набора статических сопоставлений между исходными URL-адресами и перезаписанными URL-адресами. Чтобы создать карту перезаписи, выполните следующие действия.

  1. Перейти к диспетчеру IIS

  2. Выберите "Веб-сайт по умолчанию"

  3. В представлении функций щелкните "Переопределение URL-адреса".
    Снимок экрана: перезапись U R L в представлении функций.

  4. В области "Действия" справа щелкните "Просмотреть карты перезаписи...":
    Снимок экрана: просмотр карт перезаписи...

  5. В области "Действия" на правом сайте щелкните "Добавить карту перезаписи..." а затем введите имя карты перезаписи как "StaticRewrites":
    Снимок экрана: поле Переписать имя карты.

  6. На странице созданной карты перезаписи в области "Действия" справа щелкните "Добавить запись сопоставления..." а затем введите "/article" и "/article.aspx?id=1&title=some-title" в текстовых полях "Исходное значение:" и "Новое значение:". Исходное значение указывает, из какого URL-адреса нужно переписать; Новое значение указывает, на какой URL-путь нужно переписать.
    Снимок экрана: поля Исходное значение и Новое значение.

  7. Повторите шаг 6, чтобы добавить следующие сопоставления в карту перезаписи:

    Исходное значение: Новое значение:
    /some-title /article.aspx?id=1&title=some-title
    /post/some-title.html /article.aspx?id=1&title=some-title

Теперь откройте файл web.config для веб-сайта (если вы используете веб-сайт по умолчанию, web.config можно найти по адресу %SystemDrive%\inetpub\wwwroot). Вы увидите следующий раздел:

<rewrite>
    <rewriteMaps>
        <rewriteMap name="StaticRewrites" defaultValue="">
            <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
            <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
            <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
        </rewriteMap>
    </rewriteMaps>
</rewrite>

Эта карта перезаписи, называемая StaticRewrites, будет использоваться для перезаписи входящих URL-адресов (определенных в виде ключей на карте перезаписи) на их внутренние представления (определенные как значения). Атрибут defaultValue указывает, какое значение следует использовать, если входящий URL-адрес не определен на карте. В этом случае будет возвращена пустая строка.

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

Ссылка на карту перезаписи из правила перезаписи

Чтобы создать правило перезаписи, использующее карты перезаписи, скопируйте и вставьте следующий XML-код в <rewrite> раздел файла web.config для веб-сайта:

<rules>
    <rule name="Rewrite Rule">
        <match url=".*" />
        <conditions>
            <add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
        </conditions>
        <action type="Rewrite" url="{C:1}" />
    </rule>
</rules>

Давайте рассмотрим каждый элемент правила, чтобы понять, что он делает:
<match url=".*" /> — этот элемент сообщает модулю перезаписи URL-адресов, чтобы он соответствовал любому входящему URL-адресу (с помощью специального символа регулярного выражения ".")

<add input="{StaticRewrites:{REQUEST\_URI}}" pattern="(.+)"> — это условие проверяет, что значение, возвращаемое из перезаписи карты StaticRewrites, не является пустой строкой. Для выполнения этого проверка значение переменной сервера REQUEST_URI передается в качестве параметра в карту перезаписи. Если карта перезаписи содержит запись с ключом, который совпадает с REQUEST_URI, возвращается значение, соответствующее этому ключу. Шаблон регулярного выражения будет соответствовать только непустым строкам, поэтому если пустая строка была возвращена из карты, условие будет иметь значение false, поэтому перезапись не будет выполняться. Если была возвращена непустая строка, эта строка будет записана в обратной ссылке из-за круглых скобок, используемых в шаблоне.

<action type="Rewrite" url="{C:1}" /> — этот элемент указывает, что модуль переопределения URL-адресов должен переписать текущую строку URL-адреса с новой, извлеченной из карты перезаписи. Обратите внимание, что атрибут URL ссылается на обратную ссылку условия {C:1}, которая была задана при совпадении шаблона в условии.

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

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

http://localhost/article1
http://localhost/some-title
http://localhost/post/some-title.html

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

Снимок экрана: результаты теста.

Использование карт перезаписи для перенаправления

Теперь мы создадим еще одну карту перезаписи, которая будет использоваться для определения статических сопоставлений между исходными URL-адресами и URL-адресами перенаправления. Чтобы создать карту перезаписи, выполните те же действия, что описано в разделе "Создание карты для перезаписи", но присвойте карте имя StaticRedirects и используйте следующие значения для записей сопоставления:

Исходное значение: Новое значение:
/old-article.aspx?id=1 /article.aspx?id=1
/posts/default.aspx?id=1 /article.aspx?id=1
/old-title.html /article.aspx?id=1

Теперь файл web.config для веб-сайта должен содержать следующие две карты перезаписи:

<rewriteMaps>
    <rewriteMap name="StaticRewrites">
        <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
    </rewriteMap>
    <rewriteMap name="StaticRedirects">
        <add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/old-title.html" value="/article.aspx?id=1" />
    </rewriteMap>
</rewriteMaps>

Чтобы создать правило, использующее карту перезаписи StaticRedirects, скопируйте и вставьте следующее определение правила в файл web.config для веб-сайта:

<rules>
    <rule name="Redirect Rule" stopProcessing="true">
        <match url=".*" />
        <conditions>
            <add input="{StaticRedirects:{REQUEST_URI}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" />
    </rule>
</rules>

Опять же, давайте рассмотрим каждый элемент правила, чтобы понять, что он делает:
<match url=".*" /> — этот элемент сообщает модулю перезаписи URL-адресов, чтобы он соответствовал любому входящему URL-адресу (с помощью специального символа регулярного выражения ".")

<add input="{StaticRedirects:{REQUEST\_URI}}" pattern="(.+)"> — это условие проверяет, что значение, возвращаемое из перезаписи карты StaticRedirects , не является пустой строкой. Для выполнения этого проверка значение переменной сервера REQUEST_URI передается в качестве параметра в карту перезаписи. Если карта перезаписи содержит запись с ключом, который совпадает с REQUEST_URI, возвращается значение, соответствующее этому ключу. Шаблон регулярного выражения будет соответствовать только непустым строкам, поэтому если пустая строка была возвращена из карты, условие будет иметь значение false, поэтому перезапись не будет выполняться. Если была возвращена непустая строка, эта строка будет записана в обратной ссылке из-за круглых скобок, используемых в шаблоне.

<action type="Redirect" url="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" /> — этот элемент указывает, что модуль перезаписи URL-адресов должен перенаправлять веб-клиент на новый URL-адрес, созданный путем объединения нового доменного имени (в данном случае это тот же домен для простоты) и пути URL-адреса перенаправления, возвращаемого картой StaticRedirects.

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

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

http://localhost/old-article
http://localhost/posts/default.aspx?id=1
http://localhost/old-title.html

Любой из указанных выше URL-адресов должен привести к перенаправлению браузера на http://localhost/article.aspx?id=1.

Использование карт перезаписи для параметров строки запроса

Использование карт перезаписи не ограничивается приведенными выше примерами. Карта перезаписи — это универсальная коллекция пар "ключ-значение", которую можно использовать в любом месте правила перезаписи. Чтобы проиллюстрировать это, создадим карту перезаписи, которую можно использовать для обработки параметров строки запроса.

Создайте третью карту перезаписи, выполнив те же действия, которые описаны в разделе "Создание карты для перезаписи". Назовите карту перезаписи IDtoTitleMap и используйте следующие значения для записей сопоставления:

Исходное значение: Новое значение:
1 some-title-1
2 some-title-2
3 some-title-3

Теперь файл web.config для веб-сайта должен содержать следующие две карты перезаписи:

<rewriteMaps>
    <rewriteMap name="StaticRewrites">
        <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
    </rewriteMap>
    <rewriteMap name="StaticRedirects">
        <add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/old-title.html" value="/article.aspx?id=1" />
    </rewriteMap>
    <rewriteMap name="IDtoTitleMap">
        <add key="1" value="some-title-1" />
        <add key="2" value="some-title-2" />
        <add key="3" value="some-title-3" />
    </rewriteMap>
</rewriteMaps>

Чтобы создать правило, использующее карту перезаписи IDtoTitleMap , скопируйте и вставьте следующее определение правила в файл web.config для веб-сайта:

<rules>
    <rule name="Query String Rule" stopProcessing="true">
        <match url="^article\.aspx$" />
        <conditions>
            <add input="{QUERY_STRING}" pattern="(?:^|&)id=([0-9]+)(?:&|$)" />
            <add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False" 
                                                            redirectType="Permanent" />
    </rule>
</rules>

Давайте рассмотрим каждый элемент правила, чтобы понять, что он делает:
<match url="^article\.aspx$" /> — этот элемент сообщает модулю перезаписи URL-адресов выполнить правило при запросе файла article.aspx.

<add input="{QUERY\_STRING}" pattern="(?:^|&amp;)id=([0-9]+)(?:&amp;|$)" /> — это условие проверяет, содержит ли строка запроса идентификатор параметра с числовым значением. Фактическое значение фиксируется в обратной ссылке условия. Обратите внимание, что этот шаблон будет работать, даже если в строке запроса есть другие параметры.

<add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" /> — это условие проверяет, не является ли значение, возвращаемое из перезаписной карты IDtoTitleMap , пустой строкой. Условие использует обратную ссылку из предыдущего шаблона условия в качестве входных данных для карты перезаписи.

<action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False" redirectType="Permanent" /> — этот элемент указывает, что модуль переопределения URL-адресов должен перенаправлять веб-клиент обратно в файл article.aspx, но с другим заголовком параметра строки запроса, который имеет значение, которое было искать в карте перезаписи.

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

Чтобы протестировать правило перезаписи, использующее карту "IDtoTitleMap", откройте веб-браузер и запросите любой из следующих URL-адресов:

http://localhost/article.aspx?id=1. Он будет перенаправлен по адресу http://localhost/article.aspx?title=some-title-1. http://localhost/article.aspx?someparam=somevalue&id=2. Это будет перенаправлено на http://localhost/article.aspx?title=some-title-2

Сводка

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

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