<!-- review: finished -->

<a id="http-ssi"></a>

# SSI

Фильтр, обрабатывающий команды SSI (Server Side Includes) в проходящих через него ответах.

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

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

```nginx
location / {
    ssi on;
#    ...
}
```

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

## Директивы

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

<a id="id3"></a>

### ssi

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `ssi` `on` | `off`;                   |
|------------------------------------------------------------------------------------------|---------------------------------------|
| По умолчанию                                                                             | `ssi off;`                            |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location, if в location |

Разрешает или запрещает обработку команд SSI в ответах.

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

<a id="ssi-last-modified"></a>

### ssi_last_modified

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `ssi_last_modified` `on` | `off`;   |
|------------------------------------------------------------------------------------------|-------------------------------------|
| По умолчанию                                                                             | `ssi_last_modified off;`            |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location              |

Позволяет сохранить поле заголовка `Last-Modified` исходного ответа во время обработки SSI для лучшего кэширования ответов.

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

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

<a id="ssi-min-file-chunk"></a>

### ssi_min_file_chunk

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `ssi_min_file_chunk` размер;   |
|------------------------------------------------------------------------------------------|--------------------------------|
| По умолчанию                                                                             | `ssi_min_file_chunk 1k;`       |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location         |

Задает минимальный размер частей ответа, хранящихся на диске, начиная с которого имеет смысл посылать их с помощью [sendfile](https://angie.software//angie/docs/configuration/modules/http/index.md#sendfile).

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

<a id="ssi-silent-errors"></a>

### ssi_silent_errors

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `ssi_silent_errors` `on` | `off`;   |
|------------------------------------------------------------------------------------------|-------------------------------------|
| По умолчанию                                                                             | `ssi_silent_errors off;`            |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location              |

Разрешает не выводить строку "[an error occurred while processing the directive]", если во время обработки SSI произошла ошибка.

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

<a id="ssi-types"></a>

### ssi_types

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `ssi_types` mime-тип ...;   |
|------------------------------------------------------------------------------------------|-----------------------------|
| По умолчанию                                                                             | `ssi_types text/html;`      |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location      |

Разрешает обработку команд SSI в ответах с указанными MIME-типами в дополнение к `text/html`. Специальное значение "\*" соответствует любому MIME-типу.

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

<a id="ssi-value-length"></a>

### ssi_value_length

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `ssi_value_length` длина;   |
|------------------------------------------------------------------------------------------|-----------------------------|
| По умолчанию                                                                             | `ssi_value_length 256;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location      |

Задает максимальную длину значений параметров в SSI-командах.

<a id="ssi-commands"></a>

## Команды SSI

Общий формат команд SSI такой:

```html
<!--# команда параметр1=значение1 параметр2=значение2 ... -->
```

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

<a id="samp-block"></a>

### `block`

Описывает блок, который можно использовать как заглушку в команде include. Внутри блока могут быть другие команды SSI. Параметр команды:

<a id="samp-name"></a>

#### `name`

имя блока.

Пример:

```html
<!--# block name="one" -->
заглушка
<!--# endblock -->
```

<a id="samp-config"></a>

### `config`

Задает некоторые параметры, используемые при обработке SSI, а именно:

<a id="samp-errmsg"></a>

#### `errmsg`

строка, выводящаяся при ошибке во время обработки SSI. По умолчанию выводится такая строка:

```none
`[an error occurred while processing the directive]`
```

<a id="samp-timefmt"></a>

#### `timefmt`

строка формата, передаваемая функции `strftime()` для вывода даты и времени. По умолчанию используется такой формат:

```none
`"%A, %d-%b-%Y %H:%M:%S %Z"`
```

Для вывода времени в секундах подходит формат "%s".

<a id="samp-echo"></a>

### `echo`

Выводит значение переменной. Параметры команды:

<a id="samp-var"></a>

#### `var`

имя переменной.

<a id="samp-encoding"></a>

#### `encoding`

способ кодирования. Возможны три значения — `none`, `url` и `entity`. По умолчанию используется `entity`.

<a id="samp-default"></a>

#### `default`

нестандартный параметр, задающий строку, которая выводится, если переменная не определена. По умолчанию выводится строка `(none)`.

Команда

```html
<!--# echo var="name" default="нет" -->
```

заменяет такую последовательность команд:

```html
<!--# if expr="$name" --><!--# echo var="name" --><!--#
     else -->нет<!--# endif -->
```

<a id="samp-if"></a>

### `if`

Выполняет условное включение. Поддерживаются следующие команды:

```html
<!--# if expr="..." -->
...
<!--# elif expr="..." -->
...
<!--# else -->
...
<!--# endif -->
```

На данный момент поддерживается только один уровень вложенности. Параметр команды:

<a id="samp-expr"></a>

#### `expr`

выражение. В выражении может быть:

* проверка существования переменной:

```html
<!--# if expr="$name" -->
```

* сравнение переменной с текстом:

```html
<!--# if expr="$name = text" -->
<!--# if expr="$name != text" -->
```

* сравнение переменной с регулярным выражением:

```html
<!--# if expr="$name = /text/" -->
<!--# if expr="$name != /text/" -->
```

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

```html
<!--# if expr="$name = /(.+)@(?P<domain>.+)/" -->
  <!--# echo var="1" -->
  <!--# echo var="domain" -->
<!--# endif -->
```

<a id="samp-include"></a>

### `include`

Включает в ответ результат другого запроса. Параметры команды:

<a id="samp-file"></a>

#### `file`

задает включаемый файл, например:

```html
<!--# include file="footer.html" -->
```

<a id="samp-virtual"></a>

#### `virtual`

задает включаемый запрос, например:

```html
<!--# include virtual="/remote/body.php?argument=value" -->
```

Несколько запросов, указанных на одной странице и обрабатываемых проксируемыми или FastCGI/uwsgi/SCGI/gRPC-серверами, работают параллельно. Если нужна последовательная обработка, следует воспользоваться параметром wait.

<a id="samp-stub"></a>

#### `stub`

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

```html
<!--# block name="one" -->&nbsp;<!--# endblock -->
<!--# include virtual="/remote/body.php?argument=value" stub="one" -->
```

Содержимое замещающего блока обрабатывается в контексте включаемого запроса.

<a id="samp-wait"></a>

#### `wait`

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

```html
<!--# include virtual="/remote/body.php?argument=value" wait="yes" -->
```

<a id="ssi-include-set"></a>

#### `set`

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

```html
<!--# include virtual="/remote/body.php?argument=value" set="one" -->
```

Максимальный размер ответа задается директивой [subrequest_output_buffer_size](https://angie.software//angie/docs/configuration/modules/http/index.md#subrequest-output-buffer-size):

```nginx
location /remote/ {
    subrequest_output_buffer_size 64k;
#    ...
}
```

<a id="samp-set"></a>

### `set`

Присваивает значение переменной. Параметры команды:

#### `var`

имя переменной.

<a id="samp-value"></a>

#### `value`

значение переменной. Если в присваиваемом значении есть переменные, то производится подстановка их значений.

<a id="built-in-variables-11"></a>

## Встроенные переменные

<a id="v-date-local"></a>

### `$date_local`

текущее время в локальной временной зоне. Формат задается командой config с параметром timefmt.

<a id="v-date-gmt"></a>

### `$date_gmt`

текущее время в GMT. Формат задается командой config с параметром timefmt.
