Глава 25. Перенаправление и перезапись¶
Действия этой главы позволяют изменять URL запроса или перенаправлять клиента на другой адрес. redirect() отправляет клиенту HTTP-ответ с кодом перенаправления (3xx). rewrite() модифицирует URL на стороне прокси, прозрачно для клиента.
25.1. redirect()¶
Свойство redirect() перенаправляет клиентский запрос на указанный URL. Прокси возвращает HTTP-ответ с кодом перенаправления (по умолчанию 302 Found) и заголовком Location, содержащим целевой URL.
URL перенаправления может содержать подстановочные переменные вида $(variable), которые заменяются значениями из текущей транзакции на этапе выполнения.
Синтаксис:
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:
Пример 2. Перенаправление заблокированных запросов на портал:
См. также: 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 — в планах.
Синтаксис:
where:
| Параметр | Тип | Описание |
|---|---|---|
target |
Ключевое слово | Компонент URL для перезаписи: url (полный URL), url.host (имя хоста), url.path (путь), url.query (query string). |
regex |
Строка | Регулярное выражение для поиска совпадения. |
replacement |
Строка | Строка замены. $1..$9 — группы захвата из регулярного выражения. |
Тип: Нетерминальное. Перезапись накапливается и применяется к запросу, обработка слоёв продолжается.
Слои и транзакции: <Proxy>, <Forward>. Применяется к HTTP/HTTPS proxy-транзакциям.
Пример 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-транзакциям.
Пример:
См. также: append(), delete(), Глава 26 (управление заголовками)