Переменные сервера и обратные ссылки

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

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

Использование переменных сервера

При изменении 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}&amp;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:

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