server-redirect: Перенаправление имени сервера в рамках одного запроса
Установка
Вы можете установить этот модуль в любой дистрибутив на базе RHEL, включая, но не ограничиваясь:
- RedHat Enterprise Linux 7, 8, 9 и 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 и Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-server-redirect
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-server-redirect
Включите модуль, добавив следующее в начало файла /etc/nginx/nginx.conf:
load_module modules/ngx_http_server_redirect_module.so;
Этот документ описывает nginx-module-server-redirect v0.1.2, выпущенный 6 января 2026 года.
Описание
Модуль ngx_http_server_redirect_module — это пользовательский модуль nginx, предназначенный для упрощения динамического перенаправления серверов на основе настраиваемых правил. Он позволяет пользователям условно перенаправлять входящие запросы на разные серверы.
Синопсис
Основное перенаправление
Перенаправить все запросы на 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 "request path invalid";
}
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 до того, как произойдет перенаправление.
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-server-redirect.