Polski

Przekierowania Nginx 301 i 302 na VPS Linux

2 min
Hosting VPS/VDS

Przekierowania zachowują odwiedzających i pozycję w wyszukiwarce, gdy strona zmienia adres, gdy zmieniasz domenę lub wymuszasz HTTPS. Ten poradnik pokazuje, jak napisać czyste przekierowania Nginx na swoim VPS Linux Infrawire i jak je przetestować, zanim trafią na produkcję.

📋 Wymagania wstępne

  • VPS z Linuxem (Ubuntu 24.04 / Debian 12 lub AlmaLinux 9 / Rocky 9) z dostępem SSH jako root. Adres IP i hasło roota znajdziesz w panelu klienta.
  • Zainstalowany Nginx obsługujący co najmniej jedną stronę (sudo apt install nginx lub sudo dnf install nginx).
  • Domena (example.com), której rekordy DNS A/AAAA wskazują na VPS_IP.

🧭 301 czy 302: co wybrać

  • 301 (Moved Permanently): zmiana jest ostateczna. Przeglądarki i wyszukiwarki zapamiętują ją i przenoszą pozycję na nowy adres.
  • 302 (Found): zmiana jest tymczasowa (prace serwisowe, test A/B). Stary adres pozostaje obowiązujący.

W razie wątpliwości zacznij od 302: błędny 301 może długo tkwić w pamięci podręcznej przeglądarek.

⚙️ return czy rewrite

Wybieraj return: jest szybszy i czytelniejszy, bo Nginx od razu kończy przetwarzanie.

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

rewrite stosuj tylko wtedy, gdy musisz przechwycić część adresu wyrażeniem regularnym:

Nginx
rewrite ^/blog/(\d+)/(.*)$ /articles/$2 permanent;

Flaga permanent wysyła 301, a redirect wysyła 302.

🌐 Przekierowanie www na bez www

Utwórz osobny blok server, który tylko przekierowuje. Edytuj /etc/nginx/sites-available/example.com (Debian/Ubuntu) lub /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}

W drugą stronę zamień miejscami obie nazwy hostów. $request_uri zachowuje ścieżkę i parametry zapytania.

🔒 Przekierowanie HTTP na HTTPS

Gdy certyfikat jest zainstalowany, kieruj cały ruch niezaszyfrowany na 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}

Właściwa strona działa wtedy w trzecim bloku nasłuchującym na 443 z server_name example.com;. Pamiętaj, że http2 on; wymaga Nginx 1.25.1 lub nowszego, co spełnia Ubuntu 24.04.

🔗 Ze starego adresu na nowy

Dla kilku stron używaj dokładnych dopasowań (=), które są najszybsze:

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

Dla całego przeniesionego katalogu z zachowaniem podścieżek:

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

🏠 Przekierowanie całej domeny

Gdy porzucasz old-example.com na rzecz example.com, zachowaj wszystkie ścieżki:

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}

Jeśli stara domena ma też HTTPS, dodaj odpowiedni blok listen 443 ssl; z własnym certyfikatem, inaczej przeglądarki pokażą błąd certyfikatu przed przekierowaniem.

✅ Test i bezpieczne przeładowanie

Zawsze sprawdzaj składnię przed przeładowaniem. Reload zachowuje bieżące połączenia, restart nie.

Bash
sudo nginx -t sudo systemctl reload nginx

Następnie sprawdź nagłówki bez podążania za przekierowaniem:

Bash
curl -I http://www.example.com/old-page

Oczekiwany wynik (skrócony):

HTTP/1.1 301 Moved Permanently
Server: nginx
Location: https://example.com/old-page

By prześledzić cały łańcuch i zobaczyć każdy krok, użyj curl -IL http://www.example.com/old-page. Najlepiej, gdy jest jeden krok: unikaj łańcuchów typu HTTP, potem www, potem HTTPS.

🛠️ Rozwiązywanie problemów

Zbyt wiele przekierowań (pętla). Reguła pasuje do własnego celu, często dlatego, że proxy lub CDN już kończy HTTPS. Sprawdź nagłówek Location przez curl -I i upewnij się, że docelowy blok nie przekierowuje ponownie.

Zmiana nie działa. Edytowałeś plik, który nie jest włączony. W Debianie/Ubuntu sprawdź dowiązanie w /etc/nginx/sites-enabled/, potem uruchom sudo nginx -t i sudo systemctl reload nginx. Przeglądarki buforują też 301: testuj curlem lub w oknie prywatnym.

Zgubione parametry zapytania. Przy rewrite ... ? lub stałym celu parametry znikają. Użyj $request_uri w return albo jawnie zachowaj $args.

Odpowiada zły blok. Nginx wybiera blok według server_name. Wypisz je poleceniem sudo nginx -T | grep server_name i poszukaj duplikatów.


🎉 Twoje przekierowania działają: stałe tam, gdzie zmiana jest ostateczna, tymczasowe tam, gdzie nie, i przetestowane curlem, zanim odwiedzający cokolwiek zauważą.

Bądź na bieżąco z najnowszymi ofertami, zniżkami i promocjami specjalnymi.

Zobacz promocje

Używamy plików cookie

Używamy plików cookie analitycznych, aby ulepszać nasz serwis. Nie sprzedajemy danych stronom trzecim. Więcej w polityce prywatności.