Перейти к содержанию

Глава 26. Управление заголовками

Действия управления заголовками позволяют добавлять, изменять и удалять HTTP-заголовки в запросах и ответах. Все действия этой группы нетерминальные — они накапливаются и применяются к транзакции при передаче запроса серверу или ответа клиенту.

Поддерживаются три операции: - set — установить (заменить или создать) значение заголовка - delete — удалить заголовок - append — дополнить существующий заголовок новым значением (через запятую, согласно RFC 7230)

Каждая операция доступна как для заголовков запроса (request.header), так и для заголовков ответа (response.header).

26.1. set(request.header.<Name>, value) — установить заголовок запроса

Устанавливает значение заголовка HTTP-запроса. Если заголовок уже существует — его значение заменяется. Если не существует — заголовок создаётся.

Синтаксис:

set(request.header.<Name>, <value>)
set(request.x_header.<Name>, <value>)
request.header.<Name>=<value>

где:

Параметр Тип Описание
Name Строка Имя HTTP-заголовка (например, X-Forwarded-Proto, X-Real-IP).
value Строка Новое значение заголовка.

Поддерживаются три синтаксических формы: - set(request.header.Name, "value") — функциональный BlueCoat-стиль для стандартных заголовков - set(request.x_header.Name, "value") — BlueCoat-стиль для пользовательских заголовков - request.header.Name="value" — присваивающий синтаксис

Тип: Нетерминальное. Обработка слоёв продолжается.

Слои и транзакции: <Proxy>, <Forward>. Применяется к HTTP/HTTPS proxy-транзакциям фазы запроса.

Пример:

<Proxy>
    set(request.header.X-Forwarded-Proto, "https")
    set(request.header.X-Real-IP, "$(client.address)")
    request.header.X-Custom-ID="12345"

См. также: delete(request.header), append(request.header), set(response.header)


26.2. set(response.header.<Name>, value) — установить заголовок ответа

Устанавливает значение заголовка HTTP-ответа. Если заголовок уже существует — его значение заменяется. Если не существует — заголовок создаётся.

Синтаксис:

set(response.header.<Name>, <value>)
response.header.<Name>=<value>

где:

Параметр Тип Описание
Name Строка Имя HTTP-заголовка ответа.
value Строка Новое значение заголовка.

Тип: Нетерминальное. Обработка слоёв продолжается.

Слои и транзакции: <Proxy>, <Forward>. Применяется к HTTP/HTTPS proxy-транзакциям фазы ответа.

Пример:

<Proxy>
    set(response.header.X-Frame-Options, "DENY")
    set(response.header.X-Content-Type-Options, "nosniff")
    set(response.header.Strict-Transport-Security, "max-age=31536000; includeSubDomains")

См. также: delete(response.header), append(response.header), set(request.header)


26.3. delete(request.header.<Name>) — удалить заголовок запроса

Удаляет указанный заголовок из HTTP-запроса перед отправкой на сервер. Если заголовок не существует, действие игнорируется.

Синтаксис:

delete(request.header.<Name>)

где:

Параметр Тип Описание
Name Строка Имя HTTP-заголовка для удаления.

Поддерживаются две синтаксических формы: - delete(request.header.Name) — точечная нотация - delete(request.header, "Name") — запятая-нотация (устаревшая форма)

Тип: Нетерминальное. Обработка слоёв продолжается.

Слои и транзакции: <Proxy>, <Forward>. Применяется к HTTP/HTTPS proxy-транзакциям фазы запроса.

Пример:

<Proxy>
    ; Удалить чувствительные заголовки перед передачей на сервер
    delete(request.header.Authorization)
    delete(request.header.Cookie)
    delete(request.header.X-Forwarded-For)

См. также: set(request.header), append(request.header), delete(response.header)


26.4. delete(response.header.<Name>) — удалить заголовок ответа

Удаляет указанный заголовок из HTTP-ответа перед отправкой клиенту. Используется для скрытия служебной информации от клиентов.

Синтаксис:

delete(response.header.<Name>)

где:

Параметр Тип Описание
Name Строка Имя HTTP-заголовка ответа для удаления.

Поддерживаются две синтаксических формы: - delete(response.header.Name) — точечная нотация - delete(response.header, "Name") — запятая-нотация (устаревшая форма)

Тип: Нетерминальное. Обработка слоёв продолжается.

Слои и транзакции: <Proxy>, <Forward>. Применяется к HTTP/HTTPS proxy-транзакциям фазы ответа.

Пример:

<Proxy>
    ; Скрыть информацию о серверном ПО
    delete(response.header.Server)
    delete(response.header.X-Powered-By)
    delete(response.header.X-AspNet-Version)

См. также: set(response.header), append(response.header), delete(request.header)


26.5. append(request.header.<Name>, value) — дополнить заголовок запроса

Добавляет значение к существующему заголовку запроса. Если заголовок существует, новое значение добавляется через запятую (согласно RFC 7230 Section 3.2.6). Если заголовок не существует, он создаётся с указанным значением.

Синтаксис:

append(request.header.<Name>, <value>)
append(request.x_header.<Name>, <value>)

где:

Параметр Тип Описание
Name Строка Имя HTTP-заголовка.
value Строка Значение для добавления.

Поддерживаются синтаксические формы: - append(request.header.Name, "value") — точечная нотация - append(request.x_header.Name, "value") — пользовательские заголовки (BlueCoat-стиль) - append(request.header, "Name", "value") — запятая-нотация (устаревшая форма)

Тип: Нетерминальное. Обработка слоёв продолжается.

Слои и транзакции: <Proxy>, <Forward>. Применяется к HTTP/HTTPS proxy-транзакциям фазы запроса.

Пример:

<Proxy>
    append(request.header.X-Forwarded-For, "$(client.address)")
    append(request.header.Via, "1.1 redcoat-proxy")

См. также: set(request.header), delete(request.header), append(response.header)


26.6. append(response.header.<Name>, value) — дополнить заголовок ответа

Добавляет значение к существующему заголовку ответа. Семантика аналогична append(request.header).

Синтаксис:

append(response.header.<Name>, <value>)
append(response.x_header.<Name>, <value>)

где:

Параметр Тип Описание
Name Строка Имя HTTP-заголовка ответа.
value Строка Значение для добавления.

Тип: Нетерминальное. Обработка слоёв продолжается.

Слои и транзакции: <Proxy>, <Forward>. Применяется к HTTP/HTTPS proxy-транзакциям фазы ответа.

Пример:

<Proxy>
    append(response.header.Via, "1.1 redcoat-proxy")

См. также: set(response.header), delete(response.header), append(request.header)


26.7. Комплексный пример работы с заголовками

define action security_headers
    set(response.header.X-Frame-Options, "DENY")
    set(response.header.X-Content-Type-Options, "nosniff")
    set(response.header.Referrer-Policy, "strict-origin-when-cross-origin")
    set(response.header.Strict-Transport-Security, "max-age=31536000; includeSubDomains")
    delete(response.header.Server)
    delete(response.header.X-Powered-By)
end

define action proxy_headers
    set(request.header.X-Forwarded-Proto, "https")
    append(request.header.X-Forwarded-For, "$(client.address)")
    append(request.header.Via, "1.1 redcoat-proxy")
    delete(request.header.Proxy-Authorization)
end

<Proxy>
    action.security_headers(yes)
    action.proxy_headers(yes)
    allow