Przekierowanie HTTP: 301 (stały) vs. 302 (tymczasowy)

381

Czy klient powinien zachowywać się inaczej? W jaki sposób?

Lecieć jak po sznurku
źródło
RFC 2616 - Kody stanu HTTP Mógłbym wszystko powtórzyć, ale podaje to dość wyraźnie;)
Tiemen
2
Warto zauważyć, że specyfikacja zapewnia również kody stanu 303 i 307 dla bardziej szczegółowych, tymczasowych przekierowań.
Patrick McElhaney,
303 i 307 nie są już tak naprawdę potrzebne. 303 miał określić, że nowy adres URL jest powiązany, ale nie równoważny, i powinien zostać załadowany GET, nawet jeśli bieżącym żądaniem był test POST, ale przeglądarki i tak robią to z 302. 307 miało wyraźnie określić, że przekierowanie jest tymczasowe, w przeciwieństwie do 302, które nie określiło, czy jest tymczasowe, ale przeglądarki i roboty indeksujące traktują 302 jako tymczasowe.
thomasrutter

Odpowiedzi:

569

Status 301 oznacza, że ​​zasób (strona) zostaje trwale przeniesiony do nowej lokalizacji. Klient / przeglądarka nie powinna próbować żądać oryginalnej lokalizacji, ale odtąd powinna używać nowej lokalizacji.

Status 302 oznacza, że ​​zasób znajduje się tymczasowo w innym miejscu, a klient / przeglądarka powinna nadal żądać oryginalnego adresu URL.

Philippe Leybaert
źródło
12
Dziękuję Ci. Czy to oznacza, że ​​jeśli użyję przekierowania 301 (stałego), klient może zdecydować, że nigdy nie odzyska starej lokalizacji i zamiast tego zawsze użyje bezpośrednio nowego adresu URL?
flybywire
18
Dokładnie! W rzeczywistości, zgodnie ze specyfikacją, klient MUSI zawsze iść do nowej lokalizacji.
Philippe Leybaert
7
Ale jak to wpływa na przeglądarkę? Na przykład przepisywanie historii za pomocą przycisku Wstecz, aby uniknąć powrotu do niewłaściwego w 301? Cicho zmieniając zakładkę po 301, jeśli klikniesz starą?
Xavi Montero
9
@XaviMontero Większość współczesnych przeglądarek buforuje pliki 301 i nie zawraca sobie głowy żądaniem oryginalnego źródła przez okres do 6 miesięcy
Jon
34
Trick to Remember Kody stanu HTTP 301-> Perm i 302-> Temp Redirect Two zaczyna się od T, tak samo jak Temporary zaczyna się od T.
ScottCate
108

Gdy pająk wyszukiwarki znajdzie kod stanu 301 w nagłówku odpowiedzi strony, rozumie, że ta strona już nie istnieje, szuka nagłówka lokalizacji w odpowiedzi wybiera nowy adres URL i zastępuje indeksowany adres URL nowym, a także przenosi PageRank .

Tak więc wyszukiwarka odświeża wszystkie zindeksowane adresy URL, które już nie istnieją (znaleziono 301), za pomocą nowego adresu URL, dzięki czemu zachowany zostanie stary ruch na stronie, PageRank i przekierowany na nowy (nie stracisz ruchu na starej stronie).

Przeglądarka: jeśli przeglądarka znajdzie kod stanu 301, a następnie buforuje mapowanie starego adresu URL za pomocą nowego adresu URL, klient / przeglądarka nie będzie próbować żądać oryginalnej lokalizacji, ale odtąd będzie używać nowej lokalizacji, chyba że pamięć podręczna zostanie wyczyszczona.

wprowadź opis zdjęcia tutaj

Gdy pająk wyszukiwarki znajdzie 302 status strony internetowej, przekieruje tylko tymczasowo do nowej lokalizacji i zaindeksuje obie strony. Stary adres URL strony wciąż istnieje w bazie danych wyszukiwarki i zawsze próbuje zażądać starej lokalizacji i zaindeksować ją. Klient / przeglądarka nadal będzie próbować zażądać oryginalnej lokalizacji.

wprowadź opis zdjęcia tutaj

Przeczytaj więcej o tym, jak wdrożyć go w asp.net c # i jaki jest wpływ na wyszukiwarki - http://www.dotnetbull.com/2013/08/301-permanent-vs-302-temporary-status-code-aspnet -csharp-Implementation.html

Rohit
źródło
35

Przeważnie 301 vs 302 jest ważne dla indeksowania w wyszukiwarkach, ponieważ ich roboty indeksujące biorą to pod uwagę i przenoszą PageRank podczas korzystania z 301.

Zobacz odpowiedź Petera Lee, aby uzyskać więcej informacji.

Pozostałość
źródło
20

301 oznacza, że ​​do żądanego zasobu został przypisany nowy stały identyfikator URI, a wszelkie przyszłe odniesienia do tego zasobu powinny być wykonane przy użyciu jednego ze zwróconych identyfikatorów URI.

302 oznacza, że ​​żądany zasób znajduje się tymczasowo pod innym identyfikatorem URI.

Ponieważ przekierowanie może być czasami zmieniane, klient powinien nadal używać URI żądania dla przyszłych żądań.

Ta odpowiedź jest dostępna w pamięci podręcznej tylko wtedy, gdy jest wskazana w polu nagłówka Cache-Control lub Expires.

Peter Lee
źródło
1
Więc 301 ma sens, ale trudno mi wymyślić dobry przykład zastosowania dla 302 .
Bob Stein,
4
@ BobStein-VisiBone na przykład przekierowanie 302: utwórz plik old.php z kodem <?php header("location: http://example.com/new.php"); ?>i plikiem new.php - <?php echo 'I am new'; ?>i przejdź do łącza . Przekieruje i wyświetli tekst „Jestem nowy”. Następnie zamień kod w old.php na, <?php echo 'I am old'; ?>a także przejdź do linku . Zobaczysz tekst „Jestem stary”. Jeśli wykonałeś przekierowanie 301 w old.php, zobaczysz tekst „Jestem nowy” nawet po zmianach w kodzie old.php.
Apostoł
2
@ BobStein-VisiBone Mam stronę, która jest przestarzała i nie można jej wyświetlić. Musimy stworzyć nową stronę, ale nie będziemy gotowi przez chwilę. Stosujemy tymczasowe przekierowanie do istniejącej strony, która jest przydatna dla odwiedzających. Po utworzeniu nowej strony użyjemy stałego przekierowania do niej.
EddieC,
4
302 jest przydatne, jeśli docelowy adres URL zależy od stanu.
Brian
7
Minęło trochę czasu, ale oto dobry przykład. Komiksy zazwyczaj mają adres URL, który prowadzi do najnowszego komiksu. Jeśli tak jest webcomic.com/latesti przekierowuje do webcomic.com/some-comic-title301, przeglądarka zawsze przekieruje do „some-comic-title”. Nawet jeśli kolejny komiks został opublikowany, a „najnowszy” przekierowuje teraz do „innego komiksu” ... W tym przypadku 302 byłoby lepsze.
hsan
17

Przekierowania 301 są buforowane w nieskończoność (przynajmniej przez niektóre przeglądarki).

Oznacza to, że jeśli skonfigurujesz 301, odwiedź tę stronę, nie tylko zostaniesz przekierowany, ale przekierowanie zostanie buforowane.

Gdy ponownie odwiedzisz tę stronę, Twoja przeglądarka * nawet nie zażąda tego adresu URL, po prostu trafi do pamięci podręcznej przekierowania.

Jedynym sposobem na cofnięcie 301 dla użytkownika z tym przekierowaniem w pamięci podręcznej jest ponowne przekierowanie z powrotem do oryginalnego adresu URL **. W takim przypadku przeglądarka zauważy pętlę i ostatecznie zażąda wprowadzonego adresu URL.

Oczywiście nie jest to opcja, jeśli zdecydujesz się na 301 na Facebooku lub innym zasobie, który nie jest w pełni pod kontrolą.

Niestety wielu dostawców hostingu oferuje funkcję w interfejsie administracyjnym zwaną po prostu „Przekierowaniem”, która dokonuje przekierowania 301. Jeśli używasz tego, aby tymczasowo przekierować swoją domenę na Facebooka jako stronę, która wkrótce będzie dostępna, to po prostu jesteś zepsuty.

* przynajmniej Chrome i Firefox, zgodnie z Jak długo przeglądarki buforują HTTP 301? . Właśnie wypróbowałem to z Chrome 45. Edycja: Safari 7.0.6 na Mac również buforuje, restart przeglądarki nie pomógł (Link mówi, że w Safari 5 na Windows to pomaga).

** Próbowałem javascript window.location = '', ponieważ byłoby to rozwiązanie, które można zastosować w większości przypadków - to nie działa. Powoduje niewykrytą nieskończoną pętlę. Jednak php header('Location: new.url')przerywa pętlę

Konkluzja: używaj 301s tylko wtedy, gdy masz absolutną pewność, że już nigdy nie użyjesz tego adresu URL. Zwykle nigdy w katalogu głównym (example.com/)

Sebastian Schmid
źródło
7

Głównym problemem z 301 jest to, że przeglądarka buforuje przekierowanie, nawet jeśli wyłączono przekierowanie z poziomu serwera.

Zawsze lepiej jest użyć 302, jeśli włączasz przekierowanie dla krótkiego okna konserwacji.

Jobin Joseph
źródło
Zdecydowanie nie jest to „problem”; tak po prostu ma działać. Przekierowywanie HTTP na HTTPS, Przekierowywanie opuszczonej strony do nowej itp. To niektóre z typowych zastosowań 301.
HosseyNJF