Глава 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-ответа. Если заголовок уже существует — его значение заменяется. Если не существует — заголовок создаётся.
Синтаксис:
где:
| Параметр | Тип | Описание |
|---|---|---|
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-запроса перед отправкой на сервер. Если заголовок не существует, действие игнорируется.
Синтаксис:
где:
| Параметр | Тип | Описание |
|---|---|---|
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-ответа перед отправкой клиенту. Используется для скрытия служебной информации от клиентов.
Синтаксис:
где:
| Параметр | Тип | Описание |
|---|---|---|
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). Если заголовок не существует, он создаётся с указанным значением.
Синтаксис:
где:
| Параметр | Тип | Описание |
|---|---|---|
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).
Синтаксис:
где:
| Параметр | Тип | Описание |
|---|---|---|
Name |
Строка | Имя HTTP-заголовка ответа. |
value |
Строка | Значение для добавления. |
Тип: Нетерминальное. Обработка слоёв продолжается.
Слои и транзакции: <Proxy>, <Forward>. Применяется к HTTP/HTTPS 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