URL Rewriting

Введение в URL Rewriting

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Кроме определения маршрутов в приложении ASP.NET MVC 5 нам может потребоваться такой механизм как URL Rewriting или переопределение URL-адресов, которые используются для доступа к ресурсам приложения. Например, приложение использовало один домен, потом переехало на другой - надо сделать редирект. Или стандартная проблема: перенаправление с домена с www на домен без www и наоборот. Для этого делается переопределение URL-адресов.

За переопределение URL отвечает специальный модуль URL Rewrite Module. Само переопределение производится в файле конфигурации web.config в элементе <system.webServer>, который определяется внутри элемента <configuration>

Например, определим автоматическое перенаправление с адресов с www на адреса без www:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!--остальное содержание-->
<system.webServer>
    <rewrite>
    <rules>
      <rule name="Remove WWW" patternSyntax="Wildcard" stopProcessing="true">
        <match url="*" />
        <conditions>
          <add input="{CACHE_URL}" pattern="*://www.*" />
        </conditions>
        <action type="Redirect" url="{C:1}://{C:2}" redirectType="Permanent" />
      </rule>
    </rules>
  </rewrite>
  </system.webServer>
<!---->
</configuration>

Все правила переопределения URL определяются в элементе <rewrite>. В нем мы можем использовать два типа наборов правил:

  • <globalRules>: глобальные правила, которые задаются на стороне сервера и по отношению ко всему серверу. Они определяются в файле ApplicationHost.config и не могут быть переопределены или отключены на более низком уровне (на уровне отдельных сайтов и веб-приложений). Эти правила срабатывают во время события PreBeginRequest на этапе обработки запроса.

  • <rules>: это те правила, которые задаются на более низких уровнях конфигурационной иерархии, в частности, на уровне приложения в файле web.config и которые были использованы в примере выше. Эти правила срабатывают во время события BeginRequest

Каждое правило, представленное элементом <rule>, состоит из трех частей:

  • Pattern – выражение, которому должна соответствовать строка запроса и которое задается в элементе <match>

  • Conditions – различные дополнительные условия, которым должен соответствовать URL-адрес. Например, значения HTTP-заголовков, пути к файлам и т.д.

  • Action – действие, которое должно выполняться, если строка URL соответствует регулярному выражению в Pattern и условиям Conditions

Мы можем использовать несколько правил одновременно, но их выполнение не всегда обязательно. Поэтому у каждого элемента rule определен атрибут StopProcessing. Если имеет значение true, то после выполнения действия в элементе <action> адрес URL, создаваемый данным правилом, передается в конвейер IIS, а другие правила не будут обрабатываться.

Переопределение URL имеет следующий порядок действий:

  1. Строка запроса сравнивается с выражением в элементе match. Если обнаружится, что запрошенный адрес не соответствует выражению, то модуль URL Rewrite Module прекращает обрабатывать текущее правило и переходит к следующему (если задано несколько правил)

  2. Если строка запроса соответствует выражению в элементе match и при этом не задано никаких дополнительных условий с помощью элемента <conditions>, то URL Rewrite Module выполняет действие, которое определено в правиле с помощью элемента <action>.

  3. Если строка запроса соответствует выражению в элементе match и также определены дополнительные условия, то URL Rewrite Module проверяет эти условия. И если URL соответствует этим условиям, то выполняется действие action

Pattern

С помощью атрибута url определяется выражение, с которым сравнивается строка запроса.

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

  • ECMAScript: стандарт синтаксиса регулярных выражений ECMAScript. Если мы не используем атрибут patternSyntax, то данное значение используется для правила по умолчанию.

  • Wildcard: для поиска соответствия используются метасимволы

Кроме атрибута url элемент match имеет еще ряд атрибутов:

  • negate: если имеет значение true, то правило применяется, если URL НЕ соответствует выражению в атрибуте url - то есть обратное действие. По умолчанию имеет значение false.

  • ignoreCase: если имеет значение false, то правило учитывает регистр строки URL. По умолчанию имеет значение true, то есть регистр не учитывается.

В выше использованном примере в качестве Pattern использовался следующий несложный элемент:

<rule name="Remove WWW" patternSyntax="Wildcard" stopProcessing="true">
        <match url="*" />

Звездочка означает, что строка запроса может состоять из любых символов.

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

Условия, задаваемые элементом <conditions>, определяют дополнительную логику оценки URL на соответствие правилу. Правило можно и не содержать элемента <conditions>, если он не нужен. В этом элементе определяется атрибут logicalGrouping, который может иметь одно из двух значений:

  • MatchAll: при таком значении для применения правила к URL должны быть соблюдены все условия

  • MatchAny: для применения правила к URL должно быть соблюдено хотя бы одно условие

Каждое отдельное условие задается с помощью элемента <add > и настраивается с помощью следующих атрибутов:

  • input: определяет объект, который будет использоваться условием для оценки. В частности, в примере выше используется input="{CACHE_URL}", где "CACHE_URL" представляет переменную сервера, хранящую запрошенный адрес url. Тут также могут использоваться и другие переменные сервера.

  • pattern: определяет регулярное выражение, которому должен соответствовать объект

  • matchType: принимает следующие значения:

    • Pattern: в этом случае объект (в данном случае адрес URL) сопоставляется с выражением в атрибуте pattern. При других значениях атрибут pattern не учитывается

    • IsFile: определяет, является ли объект (адрес URL) файлом в файловой системе

    • IsDirectory: определяет, является ли объект (адрес URL) каталогом в файловой системе

  • ignoreCase: указывает, надо ли игнорировать регистр адреса URL. По умолчанию равно true, поэтому регистр не учитывается

  • negate: если равно true, то правило применяется, если условие НЕ учитывается. По умолчанию равно false

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

Если выражение и условия, определяемые правилом, соответствуют объекту (например, адресу URL), то выполняется определенное действие, заданное элементом <action>. Действия могут быть нескольких типов. Тип задается с помощью атрибута type, который принимает следующие значения:

  • Rewrite: заменяет текущую строку запроса URL другой строкой

  • Redirect: выполняет редирект, посылая клиенту статусный код 3хх.

  • CustomResponse: отправляет клиенту определенный статусный код, а также может отправлять специфическое сообщение

  • AbortRequest: сбрасывает подключение для текущего клиента

Другие атрибуты элемента action:

  • url: строка, которая будет заменять текущую строку запроса URL

  • appendQueryString: определяет, должна ли сохраняться та часть строки запроса, которая идет после названия домена и порта. По умолчанию имеет значение true, что значит, что строка запроса со всеми параметрами за исключением названия домена будет сохраняться.

  • redirectType: статусный код переадресации при использовании типа Redirect (301 – Permanent, 302 – Found, 303 – See other, 307 – Temporary)

  • statusCode: определяет статусный код в качестве ответа клиенту при использовании типа CustomResponse

  • subStatusCode: определяет вспомогательный статусный код при использовании типа CustomResponse

  • statusReason: определяет сообщение, отправляемое клиенту вместе со статусным кодом при использовании типа CustomResponse

  • statusDescription: определяет сообщение, отправляемое клиенту в теле ответа при использовании типа CustomResponse

В нашем случае происходит переадресация:

<conditions>
    <add input="{CACHE_URL}" pattern="*://www.*" />
</conditions>
<action type="Redirect" url="{C:1}://{C:2}" redirectType="Permanent" />

При создании условия в атрибуте pattern используются две звездочки, которые инкапсулируют два сегмента до и после "www". Эти два сегмента передаются в действие {C:1} и {C:2}. И с их помощью мы можем построить выходной адрес URL.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850