R
редиректо.ru

Редирект в Nginx: Настройка переадресации

Скоро

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

ФлагОписание
permanent301 редирект (постоянный)
redirect302 редирект (временный)
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 с параметрами
$uriURI без параметров
$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 без регулярных выражений
  • Аналитика переходов

Попробовать бесплатно →

A B

редиректо.ru

Простая переадресация доменов.
Без лишних настроек. Без задержек.

Скоро запуск