Редиректы сохраняют посетителей и позиции в поиске, когда страница переезжает, вы меняете домен или включаете принудительный HTTPS. В этом руководстве показано, как написать аккуратные редиректы Nginx на вашем VPS Linux Infrawire и проверить их до выхода в продакшен.
📋 Требования
- Linux VPS (Ubuntu 24.04 / Debian 12 или AlmaLinux 9 / Rocky 9) с root-доступом по SSH. IP-адрес и root-пароль находятся в вашем личном кабинете.
- Установленный Nginx, обслуживающий хотя бы один сайт (
sudo apt install nginxилиsudo dnf install nginx). - Домен (
example.com), чьи DNS-записи A/AAAA указывают наVPS_IP.
🧭 301 или 302: что выбрать
- 301 (Moved Permanently): переезд окончательный. Браузеры и поисковики кэшируют его и переносят позиции на новый URL.
- 302 (Found): переезд временный (техработы, A/B-тест). Основным остаётся старый URL.
Если сомневаетесь, начните с 302: ошибочный 301 может надолго застрять в кэше браузеров.
⚙️ return или rewrite
Предпочитайте return: он быстрее и нагляднее, потому что Nginx сразу прекращает обработку.
Nginxlocation = /old-page { return 301 /new-page; }
rewrite нужен, только если часть URL требуется захватить регулярным выражением:
Nginxrewrite ^/blog/(\d+)/(.*)$ /articles/$2 permanent;
Флаг permanent отдаёт 301, redirect отдаёт 302.
🌐 Редирект с www на без www
Создайте отдельный блок server, который только перенаправляет. Отредактируйте /etc/nginx/sites-available/example.com (Debian/Ubuntu) или /etc/nginx/conf.d/example.com.conf (AlmaLinux/Rocky):
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name www.example.com; 5 return 301 $scheme://example.com$request_uri; 6}
Для обратного направления поменяйте два имени хоста местами. $request_uri сохраняет путь и строку запроса.
🔒 Редирект с HTTP на HTTPS
После установки сертификата отправьте весь незашифрованный трафик на HTTPS:
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 return 301 https://example.com$request_uri; 6} 7 8server { 9 listen 443 ssl; 10 listen [::]:443 ssl; 11 http2 on; 12 server_name www.example.com; 13 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 14 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 15 return 301 https://example.com$request_uri; 16}
Сам сайт тогда размещается в третьем блоке, который слушает 443 с server_name example.com;. Учтите, что http2 on; требует Nginx 1.25.1 или новее, как в Ubuntu 24.04.
🔗 Со старого URL на новый
Для нескольких страниц используйте точные совпадения (=), они самые быстрые:
Nginxlocation = /about-us.html { return 301 /about; } location = /promo { return 302 /offers/current; }
Для целого перенесённого каталога с сохранением подпутей:
Nginxlocation /docs/ { rewrite ^/docs/(.*)$ /help/$1 permanent; }
🏠 Редирект всего домена
Когда вы отказываетесь от old-example.com в пользу example.com, сохраняйте все пути:
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name old-example.com www.old-example.com; 5 return 301 https://example.com$request_uri; 6}
Если у старого домена тоже есть HTTPS, добавьте соответствующий блок listen 443 ssl; с собственным сертификатом, иначе браузеры покажут ошибку сертификата ещё до редиректа.
✅ Проверка и аккуратная перезагрузка
Всегда проверяйте синтаксис перед перезагрузкой. Reload сохраняет текущие соединения, restart нет.
Bashsudo nginx -t sudo systemctl reload nginx
Затем посмотрите заголовки, не следуя за редиректом:
Bashcurl -I http://www.example.com/old-page
Ожидаемый вывод (сокращённо):
HTTP/1.1 301 Moved Permanently
Server: nginx
Location: https://example.com/old-page
Чтобы пройти всю цепочку и увидеть каждый шаг, используйте curl -IL http://www.example.com/old-page. В идеале шаг один: избегайте цепочек вида HTTP, затем www, затем HTTPS.
🛠️ Устранение неполадок
Слишком много перенаправлений (цикл). Правило срабатывает на собственном адресе назначения, часто потому, что прокси или CDN уже терминирует HTTPS. Проверьте заголовок Location через curl -I и убедитесь, что целевой блок не перенаправляет снова.
Изменение не действует. Вы правили файл, который не включён. В Debian/Ubuntu проверьте ссылку в /etc/nginx/sites-enabled/, затем выполните sudo nginx -t и sudo systemctl reload nginx. Браузеры также кэшируют 301: проверяйте через curl или в приватном окне.
Потерялась строка запроса. При rewrite ... ? или фиксированной цели параметры пропадают. Используйте $request_uri в return или явно сохраняйте $args.
Отвечает не тот блок. Nginx выбирает блок по server_name. Выведите их командой sudo nginx -T | grep server_name и поищите дубликаты.
🎉 Ваши редиректы работают: постоянные там, где переезд окончательный, временные там, где нет, и проверенные через curl раньше, чем посетители что-либо заметят.