Nginx — один из самых популярных веб-серверов, особенно для высоконагруженных проектов. Настройка редиректов в Nginx отличается от Apache и выполняется через конфигурационные файлы сервера.
Основы конфигурации Nginx
В отличие от Apache с .htaccess, Nginx не поддерживает конфигурацию на уровне директорий. Все настройки выполняются в конфигурационных файлах:
/etc/nginx/nginx.conf— основной файл/etc/nginx/sites-available/— конфигурации сайтов/etc/nginx/conf.d/— дополнительные конфигурации
Структура server-блока
server {
listen 80;
server_name example.ru www.example.ru;
# Здесь настройки редиректов
}
Директива return (Рекомендуется)
Для большинства редиректов используйте директиву return — она быстрее и проще.
Базовый синтаксис
return код URL;
Редирект на другой домен
server {
listen 80;
server_name old-domain.ru;
return 301 https://new-domain.ru$request_uri;
}
$request_uri — переменная, содержащая путь и параметры запроса. Благодаря ей /page?id=1 станет https://new-domain.ru/page?id=1.
Редирект с HTTP на HTTPS
server {
listen 80;
server_name example.ru www.example.ru;
return 301 https://example.ru$request_uri;
}
server {
listen 443 ssl;
server_name example.ru;
# SSL настройки и основная конфигурация
}
Редирект с www на без www
server {
listen 80;
listen 443 ssl;
server_name www.example.ru;
return 301 https://example.ru$request_uri;
}
Редирект без www на www
server {
listen 80;
listen 443 ssl;
server_name example.ru;
return 301 https://www.example.ru$request_uri;
}
Комбинированный редирект: HTTP + www → HTTPS без www
# HTTP версии
server {
listen 80;
server_name example.ru www.example.ru;
return 301 https://example.ru$request_uri;
}
# HTTPS с www
server {
listen 443 ssl;
server_name www.example.ru;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
return 301 https://example.ru$request_uri;
}
# Основной сайт
server {
listen 443 ssl;
server_name example.ru;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
root /var/www/example.ru;
# остальные настройки
}
Директива rewrite
Для сложных правил с регулярными выражениями используйте rewrite.
Базовый синтаксис
rewrite regex замена [флаг];
Флаги rewrite
| Флаг | Описание |
|---|---|
permanent | 301 редирект (постоянный) |
redirect | 302 редирект (временный) |
last | Прекратить обработку и начать новый цикл |
break | Прекратить обработку rewrite |
Редирект одной страницы
server {
listen 80;
server_name example.ru;
rewrite ^/old-page$ /new-page permanent;
}
Редирект категории
# /blog/post-name → /articles/post-name
rewrite ^/blog/(.*)$ /articles/$1 permanent;
Редирект с удалением расширения
# /page.html → /page
rewrite ^/(.*)\.html$ /$1 permanent;
Редирект с параметрами
# /product.php?id=123 → /product/123
if ($args ~* "^id=(\d+)") {
set $product_id $1;
rewrite ^/product\.php$ /product/$product_id? permanent;
}
Редиректы внутри location
Директиву return можно использовать внутри блоков location:
server {
listen 80;
server_name example.ru;
# Редирект конкретной страницы
location = /old-page {
return 301 /new-page;
}
# Редирект категории
location /blog/ {
return 301 /articles$request_uri;
}
# Редирект с регулярным выражением
location ~ ^/category/(\d+)$ {
return 301 /c/$1;
}
}
Переменные Nginx
| Переменная | Описание |
|---|---|
$request_uri | Полный URI с параметрами |
$uri | URI без параметров |
$args | Параметры запроса (query string) |
$host | Имя хоста из запроса |
$scheme | Протокол (http или https) |
$server_name | Имя сервера из конфигурации |
Пример использования переменных
# Редирект с сохранением протокола
return 301 $scheme://new-domain.ru$request_uri;
# Редирект на HTTPS с тем же хостом
return 301 https://$host$request_uri;
Массовые редиректы через map
Для большого количества редиректов используйте директиву map:
# В блоке http (вне server)
map $request_uri $redirect_uri {
/old-page-1 /new-page-1;
/old-page-2 /new-page-2;
/blog/post-1 /articles/post-1;
/contact /contacts;
default "";
}
server {
listen 80;
server_name example.ru;
if ($redirect_uri != "") {
return 301 $redirect_uri;
}
# остальная конфигурация
}
Map с регулярными выражениями
map $request_uri $redirect_uri {
~^/blog/(\d{4})/(\d{2})/(.*)$ /articles/$1-$2-$3;
~^/category/(.*)$ /c/$1;
default "";
}
Условные редиректы
Редирект по User-Agent
if ($http_user_agent ~* "mobile") {
return 302 https://m.example.ru$request_uri;
}
Редирект по стране (GeoIP)
# Требуется модуль ngx_http_geoip_module
if ($geoip_country_code = "DE") {
return 302 https://de.example.ru$request_uri;
}
Редирект старых браузеров
if ($http_user_agent ~* "MSIE [1-8]\.") {
return 302 /browser-update;
}
Проверка и применение конфигурации
1. Проверка синтаксиса
sudo nginx -t
Вывод при успехе:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
2. Применение изменений
# Мягкая перезагрузка (без простоя)
sudo nginx -s reload
# Или через systemctl
sudo systemctl reload nginx
3. Проверка редиректа
curl -I https://example.ru/old-page
Или используйте наш тестер редиректов.
Типичные ошибки
1. Бесконечный цикл редиректов
Проблема: редирект указывает на тот же URL.
# НЕПРАВИЛЬНО
server {
listen 80;
server_name example.ru;
return 301 https://example.ru$request_uri; # Попадает сюда же!
}
Решение: разделите server-блоки.
# ПРАВИЛЬНО
server {
listen 80;
server_name example.ru;
return 301 https://example.ru$request_uri;
}
server {
listen 443 ssl;
server_name example.ru;
# основная конфигурация
}
2. Неправильный порядок server-блоков
Nginx использует первый подходящий server-блок. Убедитесь, что специфичные правила идут раньше общих.
3. Забыли $request_uri
# НЕПРАВИЛЬНО — все страницы ведут на главную
return 301 https://new-domain.ru;
# ПРАВИЛЬНО — сохраняем путь
return 301 https://new-domain.ru$request_uri;
Производительность
Nginx очень эффективен в обработке редиректов:
return— самый быстрый способrewrite— медленнее, но гибчеmap— оптимален для большого количества правил
Рекомендация: используйте return везде, где это возможно.
Альтернатива: редиректо.ru
Настройка Nginx требует доступа к серверу и технических знаний. С редиректо.ru:
- Не нужен доступ к серверу
- Настройка в визуальном интерфейсе
- Автоматический SSL сертификат
- Path Forwarding без регулярных выражений
- Аналитика переходов