Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Кроме определения маршрутов в приложении 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 имеет следующий порядок действий:
Строка запроса сравнивается с выражением в элементе match. Если обнаружится, что запрошенный адрес не соответствует выражению, то модуль URL Rewrite Module прекращает обрабатывать текущее правило и переходит к следующему (если задано несколько правил)
Если строка запроса соответствует выражению в элементе match и при этом не задано никаких дополнительных условий с помощью элемента
<conditions>
, то URL Rewrite Module выполняет действие, которое определено в правиле с помощью элемента <action>
.
Если строка запроса соответствует выражению в элементе match и также определены дополнительные условия, то URL Rewrite Module проверяет эти условия. И если URL соответствует этим условиям, то выполняется действие action
С помощью атрибута 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.