Русский (Russian)

Редиректы Nginx 301 и 302 на Linux VPS

2 min
VPS/VDS-хостинг

Редиректы сохраняют посетителей и позиции в поиске, когда страница переезжает, вы меняете домен или включаете принудительный 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 сразу прекращает обработку.

Nginx
location = /old-page { return 301 /new-page; }

rewrite нужен, только если часть URL требуется захватить регулярным выражением:

Nginx
rewrite ^/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):

Nginx
1server { 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:

Nginx
1server { 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 на новый

Для нескольких страниц используйте точные совпадения (=), они самые быстрые:

Nginx
location = /about-us.html { return 301 /about; } location = /promo { return 302 /offers/current; }

Для целого перенесённого каталога с сохранением подпутей:

Nginx
location /docs/ { rewrite ^/docs/(.*)$ /help/$1 permanent; }

🏠 Редирект всего домена

Когда вы отказываетесь от old-example.com в пользу example.com, сохраняйте все пути:

Nginx
1server { 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 нет.

Bash
sudo nginx -t sudo systemctl reload nginx

Затем посмотрите заголовки, не следуя за редиректом:

Bash
curl -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 раньше, чем посетители что-либо заметят.

Следите за последними предложениями, скидками и специальными акциями.

Смотреть акции

Мы используем файлы cookie

Аналитические cookie улучшают работу сайта. Данные не продаются третьим лицам. Подробнее в политике конфиденциальности.