301 vs 302: przekierowania stałe i tymczasowe
301 mówi, że zasób przeniósł się na stałe i nowy URL powinien wszędzie zastąpić stary; 302 mówi, że przeniesienie jest tymczasowe, a prawdziwym adresem wciąż pozostaje ten oryginalny. Wyszukiwarki działają zgodnie z tą różnicą, dlatego zły kod kosztuje Cię pozycje w rankingu.
Co oba kody mówią klientowi
Oba kody kierują klienta na adres z nagłówka Location, a dla odwiedzającego wyglądają identycznie. Różnica polega na tym, co z tą informacją robi wszystko inne. 301 zachęca klientów i roboty indeksujące, żeby zaktualizowały swoje zapisy: zmieniły zakładkę, przepisały link, indeksowały cel zamiast źródła. 302 prosi, żeby dalej korzystać z oryginalnego URL-a i tym razem po prostu zrobić objazd. Przeglądarki mogą zbuforować 301 i w ogóle przestać pytać serwer; 302 domyślnie nie jest buforowane, chyba że odpowiedź mówi inaczej.
Kiedy użyć którego
- Użyj 301 przy zmianie domeny, migracji z HTTP na HTTPS, kanonizacji non-www na www, trwałej przebudowie struktury URL, scalonej albo przemianowanej stronie, albo wycofanej stronie produktu wskazującej na najbliższy zamiennik.
- Użyj 302 dla strony konserwacji, testu A/B, wyboru strony docelowej dla regionu czy języka, który możesz jeszcze zmienić, krótkotrwałego URL-a kampanii albo tymczasowego celu w stylu "wróć później".
Nigdy nie stawiaj 301 na coś, co zamierzasz cofnąć. Ponieważ klienci go buforują, powracający odwiedzający mogą wciąż trafiać na tymczasowy cel długo po usunięciu reguły, a nie ma sposobu, żeby dosięgnąć ich cache'y. Odwrotny błąd: pozostawienie 302 przy trwałym przeniesieniu sprawia, że stary URL zostaje w indeksie, nowy zaczyna z nim konkurować, a sygnały pozostają podzielone.
Konsekwencje dla SEO
Dokumentacja Google mówi, że trwałe przekierowanie jest sygnałem, żeby cel przekierowania traktować jako kanoniczny URL, a tymczasowe przekierowanie takim sygnałem nie jest, więc oryginalny URL zachowuje swoje miejsce w indeksie. W praktyce:
- 301 konsoliduje wartość linków na celu i z czasem zastępuje stary URL w indeksie nowym.
- 302 zazwyczaj zostawia URL źródłowy w indeksie. Wyszukiwarki próbują interpretować intencję, więc długo utrzymujące się 302 może w końcu zostać potraktowane jako trwałe, ale nie powinieneś polegać na tym, że zgadną poprawnie.
- Łańcuchy przekierowań rozmywają korzyść i spowalniają crawlowanie. Kieruj stare URL-e bezpośrednio na cel końcowy.
- Przekierowywanie wielu wycofanych stron na stronę główną zwykle bywa traktowane jako miękkie 404, a nie jako przeniesienie. Przekieruj na najbliższą równoważną stronę, albo zwróć 410, jeśli nic równoważnego nie ma.
- Cokolwiek wybierzesz, utrzymuj to spójne z tagami kanonicznymi i mapą strony. Sprzeczne sygnały są gorsze niż jeden lekko nieoptymalny.
307 i 308: wersje zachowujące metodę
Oryginalne definicje 301 i 302 były niejednoznaczne co do metody HTTP, a klienci przyjęli zachowanie, które standard opisuje dziś jako historyczne: podążając za 301 albo 302 po POST, wiele klientów zmienia metodę na GET i porzuca ciało żądania. Dla strony jest to nieszkodliwe. Dla endpointu formularza albo API niszczy to żądanie i niczego nie zgłasza.
307 Temporary Redirect ma to samo znaczenie co 302, a 308 Permanent Redirect to samo znaczenie co 301, z jednym dodatkowym wymogiem dla obu: metoda i ciało muszą zostać zachowane. Więc dla URL-i, które otrzymują wyłącznie żądania GET, 301 i 302 są w porządku i to właśnie ich oczekuje większość narzędzi. Dla wszystkiego, co przyjmuje POST, PUT, PATCH czy DELETE, użyj 308 dla trwałego przeniesienia i 307 dla tymczasowego. Jeśli konkretnie chcesz, żeby po POST nastąpił GET na innym URL-u, właśnie do tego służy 303 See Other.
Jak sprawdzić, jaki kod zwraca URL
- Przeczytaj linię statusu i cel, nie podążając za przekierowaniem:
Linia statusu pokaże 301, 302, 307 albo 308, acurl -sI https://example.com/old-page | grep -Ei "^(HTTP|location|cache-control)"Locationpokaże, dokąd prowadzi. - Przejdź cały łańcuch i policz skoki, żeby zobaczyć, czy jedno przekierowanie nie zamieniło się w trzy:
curl -sIL -o /dev/null -w "%{num_redirects} hops, final %{http_code}, %{url_effective}\n" https://example.com/old-page - Przetestuj metodą POST, jeśli endpoint ją przyjmuje. Jeśli żądanie dociera do celu jako GET bez ciała, zmień regułę na 307 albo 308.
- Zmień kod tam, gdzie jest generowany. To może być aplikacja, konfiguracja serwera WWW, reguła w
.htaccessalbo CDN. Jeśli przekierowują obie warstwy, wygrywa ta zewnętrzna, a wewnętrzna reguła jest niewidoczna. - Zweryfikuj na zimnym cache'u. Przeglądarka, która już zbuforowała 301, wciąż go słucha, więc potwierdź przez curl albo okno prywatne, zanim uznasz, że zmiana nie zadziałała.
- Po trwałym przeniesieniu zostaw przekierowanie na miejscu. Usunięcie go później zrywa każdy link i zakładkę, które wciąż wskazują stary URL.
Obserwowanie przekierowania po jego ustawieniu
Przekierowanie, które zmieniło kod, zaczęło się zapętlać albo straciło certyfikat TLS, zostawia URL źródłowy wciąż odpowiadający, więc nic nie wygląda na zepsute, dopóki nie spadnie ruch. Zewnętrzne kontrole, które zapisują dokładny kod statusu i podążają za łańcuchem, wykryją to przy następnym uruchomieniu, a uruchamianie ich z wielu sieci odróżnia globalną zmianę reguły od problemu CDN w jednym regionie. HostTracker monitoruje strony internetowe od 2004 roku i wykonuje kontrole z ponad 300 punktów kontrolnych w 158 miastach. Sprawdź, co URL zwraca w tej chwili, za pomocą narzędzia do kontroli HTTP, a pełny przewodnik po rodzinie przekierowań 3xx opisuje kody po obu stronach tych dwóch.