301, 302, 307 i 308: które przekierowanie zmienia metodę żądania

Spis treści
Przekierowanie to krótka odpowiedź: nie tutaj, spróbować tam. Kosztuje jeden obieg, dla odwiedzin jest niewidoczne, a niemal każdy adres w sieci przechodzi przez co najmniej jedno.
Zadanie to wykonują cztery kody. Wyglądają jak dwie dobrane pary – trwałe i tymczasowe, dwukrotnie – a ta lektura jest błędna w sposób, który po cichu psuje formularze.

Czym przekierowanie właściwie jest
Serwer odpowiada kodem stanu z zakresu trzystu i nagłówkiem Location wskazującym inny adres. Wywołujący składa wtedy drugie żądanie pod ten adres. Z pierwszej odpowiedzi nic nie zostaje pokazane; polega ona wyłącznie na wskazaniu gdzie indziej.
Każdy skok to pełny obieg: rozwiązanie nazwy, jeśli zmienia się nazwa maszyny, połączenie, żądanie, odpowiedź. Na szybkim łączu to kilkadziesiąt milisekund. Na telefonie ze słabym zasięgiem zauważalnie więcej, a dzieje się to, zanim cokolwiek pojawi się na ekranie.
Dlatego liczba skoków liczy się tak samo jak kody. Łańcuch z trzech nie jest trzy razy wolniejszy od pojedynczego, ale daje trzy razy więcej okazji, by coś poszło źle.
Trwałe czy tymczasowe
301 mówi, że adres przeniósł się na stałe. Wyszukiwarki przenoszą ocenę na nowy adres, a stary z czasem porzucają. Przeglądarki to zapamiętują – czasem bardzo uporczywie, co warto wiedzieć, zanim kod ten trafi do użytku podczas przebudowy.
302 mówi, że objazd jest tymczasowy. Stary adres zachowuje ocenę, a na następny raz nic nie zostaje zapamiętane.
302 przy przeprowadzce ostatecznej utrzymuje martwy adres przy życiu w wynikach wyszukiwania. 301 przy objeździe tymczasowym jest gorsze: przeglądarki to zapamiętują, a kto raz zobaczył wersję tymczasową, ląduje tam być może jeszcze długo po jej wyłączeniu, bez możliwości rozpoznania przyczyny.
To rozróżnienie jest znane. Drugie znane nie jest.
Część, która zmienia metodę
Żądanie ma metodę. Odczytanie strony to GET. Wysłanie formularza to zwykle POST, a wpisane dane jadą razem z nim.
Gdy POST trafia na 301 albo 302, przeglądarki robią z niego GET. Drugie żądanie ma inną metodę niż pierwsze, a wysłane dane przepadły – nieodrzucone, niezgłoszone, po prostu niezabrane.
Tak pomyślane to nigdy nie było. Spisane reguły wymagały zachowania metody; wczesne przeglądarki zmieniały ją mimo to, dość dużo sieci się na tym oparło, a reguły w końcu odnotowały to, co i tak się działo.
Dlatego istnieją 307 i 308. One również rozróżniają przekierowanie tymczasowe i trwałe, ale dodatkowo zachowują metodę oraz treść pierwotnego żądania. Kod 307 oznacza przekierowanie tymczasowe, a 308 trwałe.
Dla adresu, który i tak bywa wyłącznie odczytywany, różnica jest bez znaczenia i dlatego latami nie rzuca się w oczy. Dla miejsca przyjmującego dane z formularza rozstrzyga ona, czy dane w ogóle docierają – a błąd wygląda jak pusty formularz, a nie jak komunikat o błędzie.

Co robi dwanaście prawdziwych witryn
Dwanaście dużych witryn wywołano 1 września 2026 spod adresu nieszyfrowanego, śledząc każdy skok do końca.
Cztery docierają po jednym skoku. Siedem potrzebuje dwóch. Jedna potrzebuje trzech. Pierwszy skok był w każdym pojedynczym przypadku kodem 301 – przejście z nieszyfrowanego na szyfrowane to ta jedna rzecz, którą wszyscy traktują jako ostateczną, i słusznie.
Drugi skok to zwykle przejście między gołą domeną a tą z www. Trzeci, gdzie występuje, to przekierowanie językowe albo regionalne: jedna witryna posłała żądanie dalej na poddomenę krajową, inna na ścieżkę językową. Te warte są uwagi, bo to skoki dokładane później, przez inny zespół, do łańcucha, który był już gotowy.
Dwie z dwunastu odpowiedziały na ostatnie żądanie odprawą zamiast stroną – obrona przed robotami zareagowała na nietypowego wywołującego. To nie mówi nic o ich przekierowaniach, a wszystko o tym, jak takie pomiary czytać.
Dlaczego każdy skok wart jest usunięcia
Łańcuch, który działa, i tak wart jest skrócenia, z trzech powodów.
Pierwszym jest czas i jest najmniejszy. Drugi: sygnały oceny słabną nieco wzdłuż łańcucha, a wyszukiwarki po kilku skokach przestają podążać całkiem.
Trzeci powoduje rzeczywiste awarie: po drodze coś ginie. Przekierowanie na inną nazwę maszyny odrzuca przy większości ustawień informację o pochodzeniu. Cookies dla gołej domeny nie jadą do poddomeny. A zmiana metody z powyższego obowiązuje przy każdym pojedynczym skoku – łańcuch zaczynający się jako 307, a idący dalej jako 301, kończy mimo to jako GET.
Łańcuchy niemal nigdy nie powstają z zamiaru. Narastają: reguła na szyfrowanie, reguła na www, reguła na ukośnik na końcu, reguła na język. Każda była słuszna, gdy dochodziła.
Co da się zmierzyć w jednym wywołaniu
Cztery pytania rozstrzygają każdy adres. Ile skoków leży między wpisanym adresem a stroną ostateczną. Jakiego kodu używa każdy skok. Czy któryś skok wskazuje na inną nazwę maszyny i czy coś musi to przetrwać. Oraz czy kod trwały stoi tam, gdzie przeprowadzka trwała nie jest.
Inspektor indeksowania śledzi łańcuch i wypisuje każdy skok z jego kodem, z czego daje się zarazem odczytać, czy adres końcowy jest tym zamierzonym.
Użyteczna odpowiedź jest krótka: ile skoków i czy któryś z nich zmienia coś, co zmieniać się nie powinno.
Pytania i odpowiedzi
Jak cofnąć omyłkowo ustawione 301?
W przypadku wyszukiwarek jest to łatwe, bo pobierają stary adres ponownie i widzą nowy stan. W przypadku przeglądarek udaje się tylko częściowo: 301 może zostać zapamiętane także bez wyraźnej wskazówki, a przeglądarka, która je zapamiętała, w ogóle nie pyta już serwera. Pomagają trzy rzeczy:
- Zapobieganie: podczas przebudowy używać 302 albo 307, a na 301 lub 308 przejść dopiero wtedy, gdy przeprowadzka jest przesądzona.
- Ograniczenie: 301 może nieść własny nagłówek Cache-Control, na przykład
max-age=3600. Przeglądarka pamięta wtedy przekierowanie tylko przez ten czas. - Bez przekierowania zwrotnego: cel nie może przekierowywać z powrotem na stary adres. Inaczej przeglądarka, która zapamiętała stare przekierowanie, skacze między oboma adresami, aż zrezygnuje.
Jeśli 301 wyszło już bez takiego ograniczenia, może pozostać w przeglądarkach długo, w najgorszym razie aż do wyczyszczenia ich pamięci podręcznej.
Które przekierowanie pasuje do endpointu API, który przenosi się na stałe?
308, bo zachowuje metodę i treść. Przy 301 z POST robią GET nie tylko przeglądarki, lecz także wiele bibliotek HTTP. Mimo to przekierowanie nadaje się tylko na okres przejściowy: nie każdy klient w ogóle podąża za nim przy POST, dlatego nowy adres powinien jak najszybciej trafić do samych klientów.