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 nginxlubsudo dnf install nginx). - Domena (
example.com), której rekordy DNS A/AAAA wskazują naVPS_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.
Nginxlocation = /old-page { return 301 /new-page; }
rewrite stosuj tylko wtedy, gdy musisz przechwycić część adresu wyrażeniem regularnym:
Nginxrewrite ^/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):
Nginx1server { 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:
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}
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:
Nginxlocation = /about-us.html { return 301 /about; } location = /promo { return 302 /offers/current; }
Dla całego przeniesionego katalogu z zachowaniem podścieżek:
Nginxlocation /docs/ { rewrite ^/docs/(.*)$ /help/$1 permanent; }
🏠 Przekierowanie całej domeny
Gdy porzucasz old-example.com na rzecz example.com, zachowaj wszystkie ścieżki:
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}
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.
Bashsudo nginx -t sudo systemctl reload nginx
Następnie sprawdź nagłówki bez podążania za przekierowaniem:
Bashcurl -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żą.