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

Глава 25. Перенаправление и перезапись

Действия этой главы позволяют изменять URL запроса или перенаправлять клиента на другой адрес. redirect() отправляет клиенту HTTP-ответ с кодом перенаправления (3xx). rewrite() модифицирует URL на стороне прокси, прозрачно для клиента.

25.1. redirect()

Свойство redirect() перенаправляет клиентский запрос на указанный URL. Прокси возвращает HTTP-ответ с кодом перенаправления (по умолчанию 302 Found) и заголовком Location, содержащим целевой URL.

URL перенаправления может содержать подстановочные переменные вида $(variable), которые заменяются значениями из текущей транзакции на этапе выполнения.

Синтаксис:

redirect(<url>)
redirect(<code>, <url>)

where:

Параметр Тип По умолчанию Описание
code Целое число (необязательный) 302 HTTP-код перенаправления: 301 (Moved Permanently), 302 (Found), 303 (See Other), 307 (Temporary Redirect), 308 (Permanent Redirect).
url Строка Целевой URL. Поддерживает подстановочные переменные $(...).

Поддерживаемые переменные в URL:

Переменная Описание
$(url) Полный исходный URL запроса
$(url.host) Имя хоста из исходного URL
$(url.path) Путь из исходного URL
$(url.query) Query string из исходного URL
$(client.address) IP-адрес клиента
$(user) Имя аутентифицированного пользователя

Тип: Терминальное. Обработка прекращается, клиенту немедленно возвращается ответ с перенаправлением.

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

Пример 1. Перенаправление HTTP на HTTPS:

<Proxy>
    url.scheme=http redirect(301, "https://$(url.host)$(url.path)")

Пример 2. Перенаправление заблокированных запросов на портал:

<Proxy>
    category=Gambling redirect(302, "https://portal.corp/blocked?url=$(url)&user=$(user)")

См. также: rewrite(), exception()


25.2. rewrite()

Свойство rewrite() перезаписывает компонент URL с помощью регулярного выражения. В отличие от redirect(), клиент не получает ответа с перенаправлением — модификация URL происходит внутри прокси, прозрачно для клиента.

Перезапись применяется к указанному компоненту URL с использованием синтаксиса регулярных выражений. Группы захвата ($1..$9) доступны в строке замены.

Поддерживаются только цели url и url.path

Реально переписываются только rewrite(url, ...) и rewrite(url.path, ...). Цели rewrite(url.host, ...) и rewrite(url.query, ...) сейчас молча игнорируются: хост и query-строка проходят без изменений. Перезапись host/query — в планах.

Синтаксис:

rewrite(<target>, <regex>, <replacement>)

where:

Параметр Тип Описание
target Ключевое слово Компонент URL для перезаписи: url (полный URL), url.host (имя хоста), url.path (путь), url.query (query string).
regex Строка Регулярное выражение для поиска совпадения.
replacement Строка Строка замены. $1..$9 — группы захвата из регулярного выражения.

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

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

Пример 1. Перезапись пути:

<Proxy>
    rewrite(url.path, "^/old/(.*)", "/new/$1")

Пример 2. Перезапись хоста для внутренней маршрутизации:

<Proxy>
    rewrite(url.host, "^public\\.example\\.com$", "internal.corp.local")
    rewrite(url.path, "^/api/v1/(.*)", "/internal/api/$1")

См. также: redirect(), set()


25.3. set() (для заголовков)

Свойство set() устанавливает значение HTTP-заголовка запроса или ответа. Это функциональный синтаксис для операций с заголовками — альтернатива присваивающему синтаксису request.header.Name=value.

Примечание: Свойство set() в Redcoat работает только с HTTP-заголовками, не с компонентами URL. Для изменения URL используйте rewrite().

Синтаксис:

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

where:

Параметр Тип Описание
request.header.<Name> Ключевое слово Стандартный заголовок запроса.
request.x_header.<Name> Ключевое слово Произвольный заголовок запроса (X-префикс, BlueCoat-совместимость).
response.header.<Name> Ключевое слово Заголовок ответа.
value Строка Новое значение заголовка.

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

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

Пример:

<Proxy>
    set(request.header.X-Forwarded-Proto, "https")
    set(response.header.X-Frame-Options, "DENY")

См. также: append(), delete(), Глава 26 (управление заголовками)