301, 302, 307 czy 308? Różnice między przekierowaniami HTTP
Kody 301, 302, 307 i 308 kierują klienta HTTP pod inny adres, ale nie znaczą tego samego. Dwie osie wyboru to trwałość zmiany oraz sposób obsługi metody żądania. Przy zwykłych stronach najczęściej decydujesz między trwałym 301 a tymczasowym 302. W formularzach i API znaczenie mają także 307 i 308.
Krótka odpowiedź: wybierz 301, gdy strona została trwale przeniesiona, i 302, gdy zmiana jest przejściowa. Kody 307 oraz 308 jednoznacznie zachowują metodę i treść żądania: 307 jest tymczasowy, a 308 trwały. Nie wybieraj kodu wyłącznie „dla SEO” — powinien zgodnie z prawdą opisywać zamiar i zachowanie aplikacji.
Tabela porównawcza
| Kod | Znaczenie | Trwałość | Zachowanie metody |
|---|---|---|---|
| 301 | Moved Permanently | trwałe | przy POST klient może zmienić metodę na GET |
| 302 | Found | tymczasowe | przy POST klient może zmienić metodę na GET |
| 307 | Temporary Redirect | tymczasowe | klient nie może zmienić metody i treści żądania |
| 308 | Permanent Redirect | trwałe | klient nie może zmienić metody i treści żądania |
„Może zmienić” jest ważnym sformułowaniem. Historyczne zachowanie klientów sprawiło, że 301 i 302 po żądaniu POST bywają wykonywane dalej jako GET. Standard HTTP opisuje tę możliwość. Kody 307 i 308 wprowadzają jednoznaczną gwarancję zachowania metody.
Co oznacza przekierowanie trwałe?
301 i 308 informują, że zasób otrzymał nowy stały adres. Przeglądarki i pośrednie pamięci mogą takie przekierowanie zapisać, a wyszukiwarki traktują je jako sygnał, że docelowy URL powinien zastąpić stary.
Typowe przypadki:
- zmiana adresu podstrony;
- połączenie dwóch artykułów w jeden lepszy materiał;
- migracja domeny;
- stała normalizacja HTTP do HTTPS;
- wybranie jednego wariantu domeny z
wwwalbo bezwww.
Nie używaj trwałego kodu podczas krótkiego testu, jeśli za chwilę chcesz przywrócić poprzedni cel. Pamięć przeglądarki może utrudnić ocenę kolejnej wersji reguły.
Co oznacza przekierowanie tymczasowe?
302 i 307 mówią, że aktualny cel jest przejściowy, a oryginalny adres nadal ma znaczenie. Mogą pasować do:
- krótkiej przerwy technicznej;
- tymczasowej strony kampanii;
- chwilowego przekierowania na zastępczy zasób;
- testu, po którym pierwotny adres wróci;
- procesu aplikacji, w którym metoda żądania musi być kontrolowana.
„Tymczasowe” nie znaczy „bez konsekwencji”. Jeśli przekierowanie pozostaje długo i inne sygnały wskazują, że zmiana jest stała, systemy mogą zinterpretować sytuację na podstawie całego zestawu danych. Najlepszą praktyką jest użycie kodu zgodnego z rzeczywistym planem.
301 — najczęstszy wybór dla trwałej zmiany strony
Kod 301 pasuje do typowej migracji dokumentu dostępnego metodą GET. Przykład odpowiedzi:
HTTP/1.1 301 Moved Permanently
Location: https://example.pl/nowy-adres/
Zaletą jest szerokie wsparcie i powszechne rozumienie. Uważaj na formularze oraz endpointy przyjmujące POST: klient może kontynuować jako GET. Jeśli metoda i treść muszą zostać zachowane, oceń 308.
302 — gdy oryginalny URL ma wrócić do normalnej roli
302 ma znaczenie tymczasowe. Przykład:
HTTP/1.1 302 Found
Location: https://example.pl/komunikat-serwisowy/
Nie stosuj go na stałe tylko dlatego, że wydaje się „bezpieczniejszy dla SEO”. Jeżeli produkt został ostatecznie przeniesiony, kod tymczasowy opisuje sytuację niezgodnie z zamiarem.
307 — tymczasowo, ale z tą samą metodą
307 zabrania automatycznej zmiany metody podczas przejścia. Żądanie POST ma pozostać POST, wraz z treścią. To przydatne w kontrolowanych przepływach aplikacji i API.
Jednocześnie oznacza ryzyko ponownego wysłania operacji pod inny adres. Nie kieruj w ten sposób formularza lub płatności bez zrozumienia, czy ponowienie jest bezpieczne i czy docelowy serwer oczekuje identycznych danych.
308 — trwały odpowiednik zachowujący metodę
308 łączy informację o stałym przeniesieniu z zakazem zmiany metody. Może być właściwy podczas trwałej migracji endpointu API. Dla zwykłej strony HTML odwiedzanej metodą GET często nie przyniesie praktycznej różnicy względem 301.
Nie zmieniaj całej witryny na 308 tylko dlatego, że kod jest nowszy. Oceń obsługiwane klienty, warstwę CDN, hosting, cache i system docelowy.
A co z kodem 303?
303 See Other jest ważny po operacji POST, gdy klient powinien przejść do innego zasobu metodą GET. Klasyczny wzorzec „Post/Redirect/Get” pomaga uniknąć ponownego wysłania formularza po odświeżeniu strony.
Przykład: użytkownik wysyła formularz, aplikacja zapisuje dane i odpowiada 303 z adresem strony potwierdzenia. Przeglądarka pobiera potwierdzenie metodą GET.
Nie zastępuj 303 kodem 307, jeśli właśnie chcesz zakończyć POST i pokazać osobny widok przez GET.
Jak wyszukiwarki traktują przekierowania?
Google dokumentuje 301 i 308 jako trwałe przekierowania oraz 302 i 307 jako tymczasowe. Przekierowania są silnym sygnałem wskazującym adres docelowy, ale nie działają w izolacji. Treść celu, linki wewnętrzne, mapa witryny, canonical i czas utrzymywania reguły powinny opisywać tę samą zmianę.
Przy migracji:
- przekieruj stary URL do najbliższego prawdziwego odpowiednika;
- unikaj łańcuchów przez pośrednie adresy;
- popraw linki wewnętrzne na cel;
- zaktualizuj canonical i mapę witryny;
- utrzymuj przekierowania wystarczająco długo;
- monitoruj błędy oraz indeksowanie.
Sam wybór 301 zamiast 308 nie naprawi błędnej mapy adresów.
Jak wybrać kod — cztery pytania
- Czy zmiana jest ostateczna? Tak: 301 lub 308. Nie: 302 lub 307.
- Czy żądanie jest zwykłym GET/HEAD? Dla stron informacyjnych zwykle wystarczy 301 albo 302.
- Czy trzeba bezwzględnie zachować POST, PUT albo inną metodę i treść? Rozważ 307 albo 308.
- Czy docelowy system bezpiecznie przyjmie ponowione żądanie? Jeśli nie wiesz, nie wdrażaj przekierowania operacji bez testów aplikacji.
Jak sprawdzić odpowiedź?
Nagłówki dla zwykłego GET:
curl -I https://example.pl/stary-adres/
Pełny łańcuch:
curl -IL https://example.pl/stary-adres/
Test POST wykonuj wyłącznie w środowisku, w którym ponowne przesłanie danych niczego nie kupi, nie usunie i nie wyśle klientowi. Narzędzie powinno pokazać kod, nagłówek Location, metodę na kolejnym kroku oraz ostateczną odpowiedź.
Najczęstsze błędy
- 302 pozostawiony przez lata po trwałej migracji;
- 301 podczas krótkiego testu, zapisany w pamięci przeglądarki;
- 307 użyty przy operacji, której nie wolno bezpiecznie powtórzyć;
- redirect do strony głównej zamiast do odpowiednika treści;
- łańcuch
HTTP → HTTPS → www → nowy slugzamiast jednego skoku; - pętla, bo cel spełnia ten sam warunek co źródło;
- ocena tylko w przeglądarce bez sprawdzenia nagłówków;
- pozostawione stare linki i canonicale mimo wdrożenia redirectu.
Decyzja w jednym zdaniu
Dla zwykłego przeniesienia strony wybierz 301, dla rzeczywiście czasowej zmiany — 302. Sięgaj po 307 i 308, gdy świadomie potrzebujesz zachowania metody oraz treści żądania. Po wdrożeniu zawsze testuj cały łańcuch i ostateczny URL.