Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
При изменении URL мы можем использовать следующие переменные сервера:
QUERY_STRING
: параметры запроса
HTTP_HOST
: домен
SERVER_PORT
: номер порта
SERVER_PORT_SECURE
и HTTPS
: указывают, использует ли клиент защищенное подключение
REQUEST_URI
: полная строка запроса
Для IIS URL представляется в следующем виде: http(s)://<host>:<port>/<path>?<querystring>
.
Допустим, пользователь обращается к URL http://www.somesite.com/home/index?id=2&name=3. Тогда IIS сегментирует ее следующим образом:
path
: представляет сегмент home/index
. Эта часть затем сравнивается правилом с выражением, определенным в элементе <match>
QUERY_STRING
: в данном случае сегмент параметров id=2&name=3
HTTP_HOST
: сегмент www.somesite.com
SERVER_PORT
: если номер порта не указан, то по умолчанию равен 80.
SERVER_PORT_SECURE
равен 0, а HTTPS
содержит OFF
REQUEST_URI
: сегмент home/index?id=2&name=3
При создании условий для правил мы можем ссылаться на эти переменные через выражение вида "{НАЗВАНИЕ_ПЕРЕМЕННОЙ}". Например, нам нужно условие, согласно которому в строке параметров должен быть числовой параметр id:
<add input="{QUERY_STRING}" pattern="id=([0-9]+)" />
Кроме того, нам доступны заголовки HTTP-запроса, например, строку юзер-агента мы можем получить с помощью выражения "{HTTP_USER_AGENT}".
При использовании заголовков запроса надо учитывать, что все дефисы в названии заголовков (например, User-Agent) заменяются символами подчеркивания. Все строчные буквы заменяются заглавными, а к названию переменных добавляется префикс "HTTP_". Как например, из заголовка User-Agent создается переменная HTTP_USER_AGENT.
Обратные ссылки представляют отдельные сегменты выражений, которые используются в условиях. Например:
<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>
{C:1} и {C:2} - это обратные ссылки, которые представляют сегменты выражения pattern="*://www.*"
.
Принцип создания обратных ссылок зависит от типа синтаксиса выражения - ECMAScript или Wildcard. Так, в примере выше использовался тип Wildcard, и каждая звездочка в выражении будет создавать из соответствующего сегмента обратную ссылку.
При использовании типа ECMAScript и стандартного синтаксиса регулярных выражений, если бы у нас было следующее условие:
<add input="{CACHE_URL}" pattern="([a-z]+)/([a-z]+)/([0-9]+)" />
То из строки запроса "home/index/2" генерировались бы три обратных ссылки "home", "index" и "2"
Все обратные ссылки представляют выражения типа {C:N}, где N - число от 0 до 9. При этом значение {C:0}
представляет всю попадающую под условие строку.
Кроме условий для создания обратных ссылок могут применяться выражения в элементе match
. Все обратные ссылки из выражения match
доступны через выражения типа {R:N}, где N - число от 0 до 9. При этом значение {R:0}
представляет всю попадающую под условие строку.
Так, рассмотрим другой пример. Допустим, у нас есть правило:
<rule name="Rewrite query" stopProcessing="true"> <match url="^home/index/([0-9]+)/([_0-9a-z-]+)" /> <action type="Rewrite" url="home/index?id={R:1}&name={R:2}" /> </rule>
Например, при запросе http://www.somesite.com/home/index/2/article мы получим следующие сегменты:
{R:0} = "home/index/2/article"
{R:1} = "2"
{R:2} = "article"
В итоге будет формироваться следующая строка URL: http://www.somesite.com/home/index?id=2&name=article
Для тестирования определил следующий метод, который выводит текущую строку запроса:
public class HomeController : Controller { public ActionResult Index(int id, string name) { return Content(Request.Url.AbsoluteUri); } }
Теперь обратимся по запросу http://localhost:5347/home/index/23/article: