server-redirect: Перенаправление имени сервера в одном запросе
Установка Debian/Ubuntu
Эти документы применимы к APT пакету nginx-module-server-redirect, предоставляемому репозиторием GetPageSpeed Extras.
- Настройте APT репозиторий, как описано в настройке APT репозитория.
- Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-server-redirect
Показать дистрибутивы и архитектуры
| Дистрибутив | Версия | Компонент | Архитектуры |
|-------------|----------|-----------|----------------|
| debian | bookworm | main | amd64, arm64 |
| debian | trixie | main | amd64, arm64 |
| ubuntu | focal | main | amd64, arm64 |
| ubuntu | jammy | main | amd64, arm64 |
| ubuntu | noble | main | amd64, arm64 |
Описание
Модуль ngx_http_server_redirect_module — это пользовательский модуль nginx, предназначенный для упрощения динамического перенаправления серверов на основе настраиваемых правил. Он позволяет пользователям условно перенаправлять входящие запросы на разные серверы.
Статус
Этот модуль Nginx в настоящее время считается экспериментальным. Проблемы и PR приветствуются, если вы столкнулись с какими-либо проблемами.
Синопсис
Основное перенаправление
Перенаправить все запросы на newserver.com без условий.
http {
server {
listen 80;
server_name example.com;
server_redirect newserver.com;
location / {
proxy_pass http://newserver.com;
}
}
server {
listen 80;
server_name newserver.com;
# Вы можете получить оригинальный хост из этой переменной.
add_header x-original-host $server_redirect_original_host;
location / {
proxy_pass http://upstream.com;
}
}
}
Условное перенаправление
Перенаправить запросы на основе наличия конкретного заголовка.
http {
server {
listen 80;
server_name example.com;
# Перенаправить, если запрос имеет заголовок 'X-Redirect' и значение не равно 0 или пусто.
server_redirect newserver.com if=$http_x_redirect;
# Вы можете использовать ngx_http_var_module для генерации переменных для суждений на основе условий.
# https://git.hanada.info/hanada/ngx_http_var_module
# var $is_ipv6 if_find $remote_addr :;
# server_redirect newserver.com if=$is_ipv6;
# Этот модуль вступает в силу после модуля real_ip,
# Поэтому директивы модуля real_ip вступят в силу на сервере перед перенаправлением сервера.
# real_ip_header x-client-ip;
location / {
proxy_pass http://newserver.com;
}
}
server {
listen 80;
server_name newserver.com;
# Вы можете получить оригинальный хост из этой переменной.
add_header x-original-host $server_redirect_original_host;
location / {
proxy_pass http://upstream.com;
}
}
}
Периодическое перенаправление
Перенаправить текущий запрос на другой сервер с первого пути запроса.
Если запрос http://example.com/newserver.com/test?arg=1, он будет перенаправлен на http:///newserver.com/test?arg=1. Этот процесс внутренний, и никакое перенаправление 302 не произойдет.
http {
server {
listen 80;
server_name example.com;
# Включить периодическое перенаправление.
schedule_redirect on;
# Запросы не дойдут сюда, если первый путь в запросе не существует или хост в первом пути недействителен.
return 400 "недействительный путь запроса";
}
server {
listen 80;
server_name newserver.com;
# Вы можете получить оригинальный хост из этой переменной.
add_header x-original-host $server_redirect_original_host;
location / {
proxy_pass http://upstream.com;
}
}
}
Конфигурация
Директива: server_redirect
Синтаксис: server_redirect target_host [if=condition]
По умолчанию: -
Контекст: server
Перенаправить текущий запрос на другой сервер. Целевой сервер должен иметь тот же порт прослушивания, что и текущий сервер.
Целевой хост должен быть конкретным именем хоста, аналогично хосту в заголовке запроса. Даже если целевой сервер, на который вы хотите перенаправить, является диким доменным именем или регулярным выражением.
Если целевой сервер не может быть найден, он будет перенаправлен на сервер по умолчанию.
Параметр if включает условное перенаправление. Запрос не будет перенаправлен, если условие будет оценено как “0” или пустая строка. Кроме того, вы также можете использовать форму if!=, чтобы сделать отрицательные суждения.
Вот пример:
server_redirect newserver.com if=$http_server_redirect;
Этот пример перенаправляет запросы на newserver.com, если заголовок Server-Redirect имеет значение и не равно 0.
Директива: schedule_redirect
Синтаксис: schedule_redirect on | off
По умолчанию: schedule_redirect off
Контекст: server
Перенаправить текущий запрос на другой сервер с первого пути запроса.
Если включено, при доступе к http://a.com/b.com/ запрос будет перенаправлен на http://b.com/. Если целевой сервер не может быть найден, он будет перенаправлен на сервер по умолчанию.
Когда директива server_redirect существует и отвечает условиям перенаправления, сначала будет выполнено server_redirect.
Если путь запроса не содержит первого пути (например, домашняя страница), перенаправление не будет выполнено.
После перенаправления даже $request_uri будет очищен от первого пути. Вы можете найти оригинальный путь запроса только в переменной строки запроса $request.
Переменная: $server_redirect_original_host
Сохраняет оригинальное значение переменной $host до того, как произойдет перенаправление.