- Home »

Создание временных и постоянных редиректов в Nginx
Если ты всё ещё думаешь, что редиректы — это что-то сложное и магическое, то сегодня мы развенчаем этот миф. Редиректы в Nginx — это основа основ веб-администрирования, и понимание их работы поможет тебе грамотно управлять трафиком, сохранять SEO-вес при смене структуры сайта и создавать качественную пользовательскую навигацию. Разберём, как быстро и правильно настроить временные и постоянные редиректы, когда использовать каждый тип, и покажем готовые примеры для реальных задач.
Что такое редиректы и зачем они нужны
Редирект — это механизм перенаправления пользователя с одного URL на другой. В HTTP протоколе это реализуется через специальные коды состояния (status codes), которые сообщают браузеру, что запрошенный ресурс находится по другому адресу.
Основные типы редиректов:
- 301 (Moved Permanently) — постоянный редирект, передаёт SEO-вес
- 302 (Found) — временный редирект, не передаёт SEO-вес
- 303 (See Other) — указывает на другой ресурс
- 307 (Temporary Redirect) — временный редирект с сохранением HTTP-метода
- 308 (Permanent Redirect) — постоянный редирект с сохранением HTTP-метода
Как работают редиректы в Nginx
Nginx обрабатывает редиректы на уровне конфигурации сервера, используя директивы return
и rewrite
. Когда приходит запрос, Nginx сверяет его с правилами в конфигурации и возвращает соответствующий HTTP-код с новым URL в заголовке Location
.
Процесс выглядит так:
- Пользователь запрашивает
example.com/old-page
- Nginx находит правило редиректа для этого URL
- Сервер возвращает код 301/302 и заголовок
Location: https://example.com/new-page
- Браузер автоматически переходит по новому адресу
Настройка постоянных редиректов (301)
Постоянные редиректы используются, когда страница навсегда переехала на новый адрес. Они передают SEO-вес и сообщают поисковикам об изменении URL.
Простой редирект одной страницы
server {
listen 80;
server_name example.com;
# Редирект конкретной страницы
location /old-page {
return 301 https://example.com/new-page;
}
# Редирект с HTTP на HTTPS
location / {
return 301 https://example.com$request_uri;
}
}
Редирект всего домена
server {
listen 80;
server_name old-domain.com;
# Редирект всего домена
return 301 https://new-domain.com$request_uri;
}
Редирект с www на без www
server {
listen 80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
Настройка временных редиректов (302)
Временные редиректы используются для краткосрочных перенаправлений, когда страница временно недоступна или перемещена.
server {
listen 80;
server_name example.com;
# Временный редирект на страницу обслуживания
location /service {
return 302 https://example.com/maintenance;
}
# Временный редирект на время A/B тестирования
location /test-page {
return 302 https://example.com/test-variant-a;
}
}
Использование директивы rewrite
Директива rewrite
более гибкая, позволяет использовать регулярные выражения и условия.
server {
listen 80;
server_name example.com;
# Редирект с захватом переменных
rewrite ^/user/([0-9]+)$ /profile?id=$1 permanent;
# Редирект категорий
rewrite ^/category/(.*)$ /shop/category/$1 permanent;
# Условный редирект
if ($args ~ "^id=([0-9]+)") {
rewrite ^/item$ /product/$1 permanent;
}
}
Практические примеры и кейсы
Задача | Тип редиректа | Пример конфигурации |
---|---|---|
Смена структуры URL | 301 | rewrite ^/blog/([0-9]+)$ /articles/$1 permanent; |
Техническое обслуживание | 302 | return 302 /maintenance.html; |
Перенос на новый домен | 301 | return 301 https://newdomain.com$request_uri; |
A/B тестирование | 302 | return 302 /variant-b$request_uri; |
Массовые редиректы из файла
Для большого количества редиректов удобно использовать map-директиву:
http {
map $request_uri $redirect_uri {
/old-page-1 /new-page-1;
/old-page-2 /new-page-2;
/old-page-3 /new-page-3;
# ... можно добавить тысячи строк
}
server {
listen 80;
server_name example.com;
if ($redirect_uri) {
return 301 $redirect_uri;
}
}
}
Редиректы с условиями
Иногда нужно делать редиректы в зависимости от различных условий:
server {
listen 80;
server_name example.com;
# Редирект для мобильных устройств
set $mobile_redirect 0;
if ($http_user_agent ~* "(Mobile|Android|iPhone)") {
set $mobile_redirect 1;
}
if ($mobile_redirect = 1) {
return 302 https://m.example.com$request_uri;
}
# Редирект по IP
if ($remote_addr ~ "192.168.1.") {
return 302 /internal-page;
}
# Редирект по referrer
if ($http_referer ~ "spam-site.com") {
return 301 /;
}
}
Отладка и тестирование редиректов
Для тестирования редиректов используй curl:
# Проверка редиректа
curl -I http://example.com/old-page
# Следование редиректам
curl -L http://example.com/old-page
# Проверка с подробной информацией
curl -v http://example.com/old-page
Полезные онлайн-инструменты для проверки:
Оптимизация производительности
Несколько советов для оптимизации редиректов:
- Используй return вместо rewrite когда возможно — это быстрее
- Избегай цепочек редиректов — максимум 1-2 перехода
- Кэшируй редиректы на уровне прокси или CDN
- Используй map для массовых редиректов вместо множества location
# Плохо - медленно
location /old1 { return 301 /new1; }
location /old2 { return 301 /new2; }
location /old3 { return 301 /new3; }
# Хорошо - быстро
map $request_uri $redirect_uri {
/old1 /new1;
/old2 /new2;
/old3 /new3;
}
server {
if ($redirect_uri) {
return 301 $redirect_uri;
}
}
Интеграция с другими инструментами
Редиректы отлично работают в связке с другими инструментами:
- Fail2ban — блокировка и редирект подозрительного трафика
- GeoIP — редиректы по геолокации
- Lua scripts — сложная логика редиректов
- Rate limiting — редирект при превышении лимитов
# Пример с GeoIP
map $geoip_country_code $redirect_country {
default "";
US /us/;
GB /uk/;
DE /de/;
}
server {
if ($redirect_country) {
return 302 $redirect_country;
}
}
Автоматизация и скрипты
Для автоматизации создания редиректов можно использовать скрипты:
#!/bin/bash
# Скрипт для генерации map-файла из CSV
input_file="redirects.csv"
output_file="/etc/nginx/redirects.map"
echo "map \$request_uri \$redirect_uri {" > $output_file
while IFS=',' read -r old_url new_url; do
echo " $old_url $new_url;" >> $output_file
done < "$input_file"
echo "}" >> $output_file
# Проверка конфигурации и перезагрузка
nginx -t && nginx -s reload
Мониторинг и логирование
Настройка логирования редиректов поможет отслеживать их работу:
http {
log_format redirect_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'redirect_to="$sent_http_location"';
server {
access_log /var/log/nginx/redirects.log redirect_log;
location /old-section {
access_log /var/log/nginx/redirects.log redirect_log;
return 301 /new-section;
}
}
}
Частые ошибки и как их избежать
- Бесконечные циклы — всегда проверяй конечную точку редиректа
- Неправильные regex — тестируй регулярные выражения отдельно
- Потеря POST данных — используй 307/308 для сохранения метода
- Игнорирование HTTPS — всегда учитывай SSL в редиректах
Продвинутые техники
Для сложных проектов можно использовать более продвинутые техники:
# Редирект с сохранением query параметров
location /search {
return 301 /new-search?$args;
}
# Редирект с модификацией параметров
location /old-api {
rewrite ^/old-api/(.*)$ /v2/api/$1?version=2&$args permanent;
}
# Условный редирект с несколькими условиями
set $redirect_mobile 0;
if ($http_user_agent ~* "Mobile") {
set $redirect_mobile M;
}
if ($request_uri ~ "^/shop") {
set $redirect_mobile "${redirect_mobile}S";
}
if ($redirect_mobile = MS) {
return 302 /mobile-shop;
}
Сравнение с Apache и другими серверами
Функция | Nginx | Apache | Преимущества Nginx |
---|---|---|---|
Производительность | Высокая | Средняя | Меньше потребление ресурсов |
Гибкость regex | Хорошая | Отличная | Проще синтаксис |
Конфигурация | Централизованная | .htaccess | Лучше для администрирования |
Отладка | Хорошая | Хорошая | Встроенные инструменты |
Рекомендации для продакшена
При работе с редиректами в продакшене следуй этим правилам:
- Тестируй на stage — всегда проверяй редиректы на тестовом окружении
- Делай бэкапы — сохраняй старые конфигурации
- Мониторь 404 — следи за битыми ссылками
- Используй версионирование — держи конфигурации в Git
- Документируй изменения — веди changelog редиректов
Если тебе нужен надёжный сервер для экспериментов с Nginx, рекомендую взять VPS или выделенный сервер для серьёзных проектов.
Заключение
Редиректы в Nginx — это мощный инструмент, который при правильном использовании может значительно улучшить SEO, UX и общую архитектуру проекта. Главное — понимать разницу между временными и постоянными редиректами, тестировать изменения и не создавать сложные цепочки переходов.
Начни с простых примеров из этой статьи, постепенно усложняя логику. Помни, что хороший редирект — это незаметный редирект, который пользователь даже не замечает. И не забывай про мониторинг — логи покажут, как работают твои правила на практике.
Успехов в настройке серверов!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.