<!-- review: finished -->

<a id="stream-map"></a>

# Map

Создает переменные, значения которых зависят от значений других переменных.

<a id="configuration-example-62"></a>

## Пример конфигурации

```nginx
map $remote_addr $limit {
    127.0.0.1    "";
    default      $binary_remote_addr;
}

limit_conn_zone $limit zone=addr:10m;
limit_conn addr 1;
```

<a id="directives-71"></a>

## Директивы

<a id="index-0"></a>

<a id="s-map"></a>

### map

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `map` строка $переменная { ... };   |
|------------------------------------------------------------------------------------------|-------------------------------------|
| По умолчанию                                                                             | —                                   |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream                              |

Создает новую переменную.
Ее значение зависит от первого параметра, заданного строкой с переменными,
например:

```nginx
set $var1 "foo";
set $var2 "bar";

map $var1$var2 $new_variable {
    default "foobar_value";
}
```

Здесь переменная `$new_variable` будет иметь значение,
составленное из двух переменных `$var1` и `$var2`,
или значение по умолчанию, если эти переменные не определены.

#### NOTE
Поскольку переменные вычисляются только в момент использования, само по себе наличие даже большого числа объявлений переменных `map` не влечет за собой никаких дополнительных расходов на обработку запросов.

Параметры внутри блока `map` задают соответствие между исходными и результирующими значениями.

Исходные значения задаются строками или регулярными выражениями.

Строки проверяются без учета регистра.

Перед регулярным выражением ставится символ `~`, если при сравнении
следует учитывать регистр символов, либо символы `~*`, если регистр
символов учитывать не нужно. Регулярное выражение может содержать именованные и
позиционные группы захвата, которые могут затем использоваться в других директивах
совместно с результирующей переменной.

Если исходное значение совпадает с именем одного из специальных параметров,
описанных ниже, перед ним следует поставить символ `\`.

В качестве результирующего значения можно указать текст, переменную и их комбинации.

Также поддерживаются следующие специальные параметры:

| `default` значение   | задает результирующее значение, если исходное значение не совпадает ни с<br/>одним из перечисленных. Если параметр `default` не указан,<br/>результирующим значением по умолчанию будет пустая строка.   |
|----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `hostnames`          | указывает, что в качестве исходных значений можно использовать маску для<br/>первой или последней части имени хоста. Этот параметр следует указывать<br/>перед списком значений.                         |

Например,

```nginx
*.example.com 1;
example.*     1;
```

Вместо двух записей

```nginx
example.com   1;
*.example.com 1;
```

можно использовать одну:

```nginx
.example.com  1;
```

| `include` файл   | включает файл со значениями. Включений может быть несколько.   |
|------------------|----------------------------------------------------------------|
| `volatile`       | указывает, что переменная не кэшируется.                       |

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

1. Cтроковое значение без маски.
2. Самое длинное строковое значение с маской в начале, например `*.example.com`.
3. Самое длинное строковое значение с маской в конце, например `mail.*`.
4. Первое подходящее регулярное выражение (в порядке следования в конфигурационном файле).
5. Значение по умолчанию (`default`).

<a id="index-1"></a>

<a id="s-map-hash-bucket-size"></a>

### map_hash_bucket_size

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `map_hash_bucket_size` размер;    |
|------------------------------------------------------------------------------------------|-----------------------------------|
| По умолчанию                                                                             | `map_hash_bucket_size 32|64|128;` |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream                            |

Задает размер корзины в хэш-таблицах для переменных [map](#s-map). Значение по умолчанию зависит от размера строки кэша процессора. Подробнее настройка хэш-таблиц обсуждается [отдельно](https://angie.software//angie/docs/configuration/configfile.md#configure-hashes).

<a id="index-2"></a>

<a id="s-map-hash-max-size"></a>

### map_hash_max_size

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `map_hash_max_size` размер;   |
|------------------------------------------------------------------------------------------|-------------------------------|
| По умолчанию                                                                             | `map_hash_max_size 2048;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | stream                        |

Задает максимальный размер хэш-таблиц для переменных [map](#s-map). Подробнее настройка хэш-таблиц обсуждается [отдельно](https://angie.software//angie/docs/configuration/configfile.md#configure-hashes).
