Jak długo przeglądarki buforują HTTP 301?

380

Debuguję problem ze stałym przekierowaniem HTTP 301. Po szybkim teście wygląda na to, że Safari usuwa pamięć podręczną z 301 sekund po ponownym uruchomieniu, ale Firefox nie.

Kiedy IE, Chrome, Firefox i Safari usuwają pamięć podręczną 301s?

UPDATE: Na przykład, jeśli chcę, aby przekierować example1.comdo example2.com, ale przypadkowo ustawić go przekierować do example3.com, że jest problem. Mogę poprawić błąd, ale każdy, kto odwiedził example1.comw międzyczasie nie będzie buforowane niepoprawne przekierowanie example3.com, i tak nie będą w stanie dotrzeć albo example1.comalbo example2.comdopóki ich cache jest czyszczony. Po dochodzeniu, uważam, że tam nie było Cache-Controli Expiresustawić nagłówki. Nagłówki niepoprawnej odpowiedzi 301 wyglądałyby tak:

HTTP/1.1 301 Moved Permanently
Date: Wed, 27 Feb 2013 12:05:53 GMT
Server: Apache/2.2.21 (Unix) DAV/2 PHP/5.3.8
X-Powered-By: PHP/5.3.8
Location: http://example3.com/
Content-Type: text/html

Moje własne testy pokazują, że:

  • IE7, IE8, Android 2.3.4 w ogóle nie buforują.
  • Firefox 18.0.2, Safari 5.1.7 (w systemie Windows 7) i Opera 12.14 wszystkie pamięci podręcznej i wyczyść pamięć podręczną po ponownym uruchomieniu przeglądarki.
  • Pamięć podręczna przeglądarki IE10 i Chrome 25, ale nie usuwaj danych po ponownym uruchomieniu przeglądarki, więc kiedy wyczyszczą?
Liam
źródło
7
Powiedz chromowi,
BT
@BT, ponieważ problem dotyczy wszystkich przeglądarek, tak naprawdę tylko IETF może to naprawić, prawdopodobnie poprzez zdefiniowanie pewnego obowiązkowego limitu czasu dla pamięci podręcznych 301, które nie mają TTL, aby przeglądarki w końcu ponownie zweryfikowały swoje buforowane założenia.
McGuireV10,
1
Rozpocząłem dyskusję na temat listy mailingowej IETF na ten temat, jeśli ktoś nadal śledzący ten problem ma
ochotę

Odpowiedzi:

299

Co najmniej dwie przeglądarki - Chrome i Firefox - będą buforować przekierowanie 301 bez daty wygaśnięcia .

Oznacza to, że pozostanie w pamięci podręcznej tak długo, jak długo pamięć podręczna przeglądarki będzie w stanie to pomieścić. Zostanie on usunięty z pamięci podręcznej, jeśli ręcznie wyczyścisz pamięć podręczną lub jeśli wpisy w pamięci podręcznej zostaną wyczyszczone, aby zrobić miejsce dla nowych.

Możesz to zweryfikować przynajmniej w przeglądarce Firefox, przechodząc do about:cachei znajdując go w pamięci podręcznej dysku.

Nie wiem o zachowaniu innych przeglądarek, takich jak IE10 / IE11. Jednak biorąc pod uwagę, że inne przeglądarki przechowują go w pamięci podręcznej w nieskończoność, i tak będziesz musiał to uwzględnić.

We wszystkich przeglądarkach, w tym Chrome / Firefox, nadal można zastąpić to domyślne zachowanie za pomocą nagłówków, jak opisano poniżej:

Uwaga: ta odpowiedź została napisana w 2014 roku, a zachowanie przeglądarki może z czasem ulec zmianie.

Jeśli nie chcesz, aby przekierowanie było buforowane

To nieokreślone buforowanie jest domyślnym buforowaniem tylko tych przeglądarek przy braku nagłówków Cache-Control. Logika polega na tym, że określasz „trwałe” przekierowanie i nie podajesz im żadnych instrukcji buforowania, więc będą traktować to tak, jakbyś chciał buforować w nieskończoność.

Przeglądarki nadal honorują nagłówki Cache-Control i wygasają nagłówki, jak w przypadku każdej innej odpowiedzi, jeśli są one określone.

Możesz dodać nagłówki takie jak Cache-Control: max-age=3600lub Expires: Thu, 01 Dec 2014 16:00:00 GMTdo swoich przekierowań 301. Możesz nawet dodać, Cache-Control: no-cacheaby nie była trwale buforowana przez przeglądarkę lub Cache-Control: no-storeaby nie mogła być nawet przechowywana w pamięci tymczasowej przez przeglądarkę.

Jednak moim zdaniem lepszą alternatywą jest użycie przekierowania 302 lub 307. Nie sugerują one przeglądarkom ani pamięci podręcznej, że są „stałymi” przekierowaniami, a zatem nie powinny być buforowane przy braku nagłówków Cache-Control.

Wydaje mi się, że wydaje się przekierowanie 301, ale oznaczenie go jako niemożliwego do buforowania jest sprzeczne z duchem tego, do czego służy przekierowanie 301, chociaż może być technicznie poprawne. YMMV i możesz znaleźć przypadki skrajne, w których sensowne jest, aby „trwałe” przekierowanie miało limit czasu.

Jeśli wcześniej wydałeś przekierowanie 301, ale nie chcesz tego robić

Jeśli ludzie nadal mają buforowane przekierowanie 301 w przeglądarce, nadal będą przekierowywani na stronę docelową, niezależnie od tego, czy strona źródłowa nadal ma przekierowanie na swoim miejscu. Dostępne opcje naprawy:

  • Najprostszym i najlepszym rozwiązaniem jest ponowne wydanie kolejnego przekierowania 301.

    Przeglądarka zda sobie sprawę, że jest przekierowywana z powrotem do tego, co wcześniej uważała za wycofany z użytku adres URL, i powinno to spowodować ponowne pobranie tego adresu URL ponownie, aby potwierdzić, że stare przekierowanie nadal nie istnieje.

    Edycja: niektóre komentarze podają w to wątpliwości, patrz poniżej.

  • Jeśli nie masz kontroli nad witryną, do której trafił poprzedni cel przekierowania, masz pecha. Spróbuj błagać właściciela witryny o przekierowanie z powrotem do Ciebie.

Lepiej też zapobiegać niż leczyć - unikaj przekierowania 301, jeśli nie jesteś pewien, czy chcesz na stałe wycofać stary adres URL.

thomasrutter
źródło
18
Czy masz też jakieś referencje, które pokazują, że przeglądarki obsługują stałe przekierowania okrągłe poprzez ponowne pobranie oryginalnego adresu URL?
Kevin Christopher Henry
7
Przekierowanie 301 z powrotem nie działa, przeglądarka wciąż buforuje stare przekierowanie 301 i widzę nieskończoną pętlę
Jurij Kołodowski
5
jak to zrobiłem próbę: jakiś czas temu zrobiłem zrobić przekierowanie 301 dla http://www.SOMEHOST.comcelu https://www.SOMEHOST.com. Ale teraz http://www.SOMEHOST.commusi być głównym hostem witryny. Usunięto więc przekierowanie z https na http. Jak pokazałeś, zrobiłem przekierowanie 301 z https://www.SOMEHOST.comna http://www.SOMEHOST.com, ale zobacz pętlę. Przeglądarka nie pobierała ponownie ...
Jurij Kolodovskyy
8
Potwierdzam, że przekierowanie z powrotem (w moim przypadku z przekierowaniem PHP) działa idealnie w przeglądarce Google Chrome, o ile (oczywiście) usunięto początkowe przekierowanie 301.
Vincent Poirier
15
Mogę potwierdzić, że przekierowanie z powrotem działa idealnie. Przeglądarki widzące pętlę przekierowania unieważniają wpisy w pamięci podręcznej. Testowane na IE11, Firefox 52, Safari 10, Chrome 57.
Munhitsu
258

Z Chrome 71

Aby usunąć trwałe przekierowanie, przejdź do chrome: // settings / clearBrowserData, a stamtąd wyczyszczenie „buforowanych obrazów i plików” wyczyściło przekierowanie.

Chrome 48–70

Przejdź do chrome: // net-internals. Po prawej stronie górnego czerwonego paska stanu kliknij strzałkę w dół ▼, aby otworzyć menu rozwijane, aw grupie „Narzędzia” wybierz „Wyczyść pamięć podręczną”.

Od wersji 48 była to jedyna rzecz, która działała dla mnie, aby wyczyścić pamięć podręczną 301.

McGuireV10
źródło
14
Począwszy od wersji 54 Chrome, niestety to nie działa.
pwagner
4
Z drugiej strony tak naprawdę nie odpowiedziałem na prawdziwe pytanie: „Jak długo przeglądarki przechowują pamięć podręczną 301 w pamięci podręcznej”, a moja odpowiedź nie pomogłaby nikomu, kto przekierował witrynę publiczną, w której prawdopodobnie potrzebujesz sposobu na trwałe cofnięcie 301 nie wiedząc, ile przeglądarek na wolności zapisało przekierowanie w pamięci podręcznej - inne odpowiedzi częściowo rozwiązują ten scenariusz. Moja odpowiedź jest naprawdę przydatna tylko dla programistów lub intranetowych scenariuszy, w których można komunikować się ze wszystkimi użytkownikami, których dotyczy problem.
McGuireV10,
1
Działa w wersji Chrome 68.0.3440.106 (oficjalna wersja)
Thum Choon Tat
12
chrome: // net-internals został wypatroszony w Chrome 71. Z menu rozwijanego / Narzędzi zniknęło. Istnieje przycisk DNS> Pamięć podręczna programu tłumaczącego hosta> Wyczyść pamięć podręczną hosta, ale nie działa to w przypadku usuwania pamięci podręcznej 301.
t-jam
52
W Chrome 71 chrome: // settings / clearBrowserData, a stamtąd tylko czyszczenie „buforowanych obrazów i plików” usuwało przekierowanie.
Bemmu
179

Odpowiedź, która pomaga tym, którzy desperacko chcą pozbyć się pamięci podręcznej przekierowania:

Chrome buforuje przekierowanie 301 w nieskończoność (w lokalnej pamięci podręcznej dysku). Aby wyczyścić tę pamięć podręczną:

  • otwórz swoje DevTools (naciśnij F12)
  • na karcie Sieć zaznacz „Wyłącz pamięć podręczną” wyboru
  • pozostaw DevTools otwarte i ponownie załaduj stronę (naciśnij F5)

Gdy wszystko będzie w porządku, możesz odznaczyć opcję „Wyłącz pamięć podręczną”, a wszystko będzie działać zgodnie z oczekiwaniami.

Olaf
źródło
14
Działa to i nawet po ponownym włączeniu buforowania przekierowanie zniknęło. DZIĘKI!
migg
2
Wygląda na to, że nie działa to dla domen wskazanych na 127.0.0.1 przez lokalny plik hosts. Czy jest jakaś inna opcja dla tego przypadku?
pwagner
Nie działa, jeśli przekierowanie, niezamierzone, wskazuje inny port, na przykład od localhost:8000do localhost(port 80). Wyczyściłem również całą witrynę / dane aplikacji zarówno z localhost, jak i localhost: 8000, ale to też nie pomogło.
Dennis98
3
To rozwiązanie działa w Chrome od 16 listopada 2019 r. W wersji 78.0.3904.97. Inne rozwiązania nie są już dostępne. Po uruchomieniu możesz zamknąć narzędzia programistyczne i nadal będzie działać poprawnie.
Peter Wooster,
Zaakceptowana odpowiedź.
Aysennoussi
43

Niech użytkownik prześle formularz postu na ten adres URL, a przekierowanie z pamięci podręcznej zniknie :)

<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
    <input type="submit" value="fix" />
</form>
</body>
Krtek Net
źródło
2
Zgadzam się, że to najlepsza metoda, jaką udało mi się odkręcić.
esjay,
w przeciwieństwie do innych odpowiedzi, ta metoda jest odpowiednia do rozwiązywania problemów innych osób bez otwierania konsoli programisty! dziękuję
Aleksiej Rytikow
4
fetch („URL”, {method: „POST”}) powinien wykonać tę samą operację. Dzięki! To zaoszczędziło mi trochę bólu głowy!
calvin
Nie mogę uwierzyć, że jest to jedyny sposób, który zadziałał dla mnie (najpierw wypróbowałem wszystkie inne metody - nawet nie powiodła się funkcja pobierania z konsoli ze względu na zasady bezpieczeństwa między witrynami).
user36388
24

301jest buforowalną odpowiedzią na HTTP RFC, a przeglądarki będą ją buforować w zależności od nagłówków HTTP buforowania, które masz na odpowiedzi. Użyj FireBug lub Charles, aby sprawdzić nagłówki odpowiedzi, aby poznać dokładny czas trwania buforowania odpowiedzi.

Jeśli chcesz kontrolować czas buforowania, możesz użyć nagłówków odpowiedzi HTTP Cache-Controli Expireszrobić to samo. Alternatywnie, jeśli w ogóle nie chcesz buforować 301odpowiedzi, użyj następujących nagłówków.

Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Alex J.
źródło
12
Chociaż technicznie poprawne, twoja odpowiedź nie odpowiada na pytanie użytkowników, a zatem nie odpowiada na pytanie, po które tu przyszedłem. Kiedy wygasają istniejące, odblokowane 301 nagłówki 301 już w przeglądarce dla głównych przeglądarek?
okradać
Jeśli ktoś jest nadal zainteresowany, ta instrukcja łącza może przełączyć pamięć podręczną dla 301.
Francisco Presencia
Link jest do FF i nie działał dla mnie. Zainstalowałem rozszerzenie web developer 1.2.5 i korzystam z FF 23.0.1
phu
pytanie nie zostało udzielone. Pytanie brzmiało: jak długo przekierowanie będzie przechowywane w pamięci podręcznej, jeśli nie zostanie określona data wygaśnięcia
Dennis Flagg
21

Istnieje bardzo prosty sposób na usunięcie pamięci podręcznej przeglądarki dla przekierowań HTTP, np. 301, 307 itp.

Możesz otworzyć panel sieciowy w konsoli programisty w chrome. Wybierz połączenie sieciowe. Kliknij go prawym przyciskiem myszy, a następnie kliknij polecenie Wyczyść pamięć podręczną przeglądarki, aby usunąć buforowane przekierowanie.

menu kontekstowe połączeń sieciowych

Rajesh Paul
źródło
1
Dziękuję Ci bardzo! Proste rozwiązanie i działało! Ten sposób powinien również działać w przyszłości.
sgon00,
16

Potwierdzony!! poproś użytkownika o przesłanie żądania wpisu do adresu URL, którego dotyczy problem, a przekierowanie w pamięci podręcznej zostanie zapomniane.

Szybką wygraną byłoby wprowadzenie tego w konsoli przeglądarki, jeśli możesz:

fetch('example.com/affected/link', {method: 'post'}).then(() => {})

Przydatne, jeśli znasz przeglądarkę, której dotyczy problem (szczególnie podczas programowania).

Alternatywnie , jeśli masz dostęp do poprzedniej strony przekierowania 301, możesz dodać ten skrypt do strony i za każdym razem, gdy zostanie ona odwiedzona, pamięć podręczna 301 zostanie zapomniana.

Emeke Ajeh
źródło
Jest to podobne do powyższego formularza pocztowego, tyle że mniej wysiłku.
jpswade
Zgadza się @jpswade
Emeke Ajeh
12

Zamieszczę odpowiedź, która pomogła mi:

przejdź do adresu URL:

chrome://settings/clearBrowserData

powinien wywołać wyskakujące okienko, a następnie ...

  • wybierz tylko: cached images and files.
  • wybierz pole czasu: from beginning
John Tribe
źródło
Praca w Chrome 79!
webaholik
Działa w Chrome 80, dzięki!
Joseph
6

jako odpowiedź @thomasrutter

Jeśli wcześniej wydałeś przekierowanie 301, ale nie chcesz tego robić

Jeśli ludzie nadal mają buforowane przekierowanie 301 w przeglądarce, nadal będą przekierowywani na stronę docelową, niezależnie od tego, czy strona źródłowa nadal ma przekierowanie na swoim miejscu. Dostępne opcje naprawy:

Najprostszym i najlepszym rozwiązaniem jest ponowne wydanie kolejnego przekierowania 301.

Przeglądarka zda sobie sprawę, że jest przekierowywana z powrotem do tego, co wcześniej uważała za wycofany adres URL, a to powinno spowodować ponowne pobranie tego adresu URL ponownie, aby potwierdzić, że stare przekierowanie nadal nie istnieje.

Jeśli nie masz kontroli nad witryną, do której trafił poprzedni cel przekierowania, masz pecha. Spróbuj błagać właściciela witryny o przekierowanie z powrotem do Ciebie.

W rzeczywistości oznacza to:

  1. a.com 301 na b.com

  2. usuń 301 z a.com

  3. dodaj b.com 301 do a.com

To działa.

phil han
źródło
2
Ale nadal masz 301 b.com leżących wokół: (- brudna poprawka
BT
1
Czy możesz usunąć przekierowanie, wydając kolejne 301 z innej strony? np. ( a.com301 -> b.com) (usuń a.com301) (dodaj a.com/abcdefg301 -> a.com) i zmuś klienta, aby a.com/abcdefgjakoś wyświetlił ?
nemec
Dzięki, działa! Testowane na IE11, Firefox 52, Safari 10, Chrome 57
Munhitsu
Miałem sytuację, w której chciałem używać zarówno a.com, jak i b.com. Więc b.com 301 a.com nie było opcją. Naszym rozwiązaniem było przejście na HTTPS - nie mieliśmy przekierowań na HTTPS
rosell.dk
6

Mam proste rozwiązanie, które działało na wszystkich głównych przeglądarkach (najnowsza wersja), w tym IE, Chrome i FF

  1. Ctrl + Shift + Del
  2. -
    1. Chrome: wybierz „Historia przeglądania” i „Pamięć podręczna ...”
    2. IE: pozostawiam domyślną opcję „Tymczasowe pliki internetowe i pliki stron internetowych”, „Pliki cookie i dane witryn”, „Historia”
    3. FF: „Historia przeglądania i pobierania”, „Pamięć podręczna”
  3. Kliknij „Usuń”
  4. Zamknij i ponownie otwórz przeglądarkę. To powinno działać
Dung Le
źródło
Powinieneś także upewnić się, że nie jesteś na danej stronie, ponieważ niektóre przeglądarki nie usuwają elementów z pamięci podręcznej z otwartych stron.
Oliver Schimmer
6

Do celów testowych (w celu uniknięcia buforowanych przekierowań) ludzie mogą otwierać NOWE PRYWATNE OKNO : kliknij CTRL+SHIFT+N[jeśli używasz Mozilli, użyj P]

T.Todua
źródło
Zostało to obniżone, prawdopodobnie dlatego, że główną obietnicą „prywatnego okna” nie jest NAPISZ do pamięci podręcznej, ale nadal można ją ODCZYTAĆ / WYKORZYSTAĆ. ALE dla mnie w przeglądarce Firefox 37.0.1 (Linux) to działało i było bardzo szybkie i przydatne. Prywatne okno odzwierciedla bieżące / niebuforowane ustawienia serwera WWW, podczas gdy normalne karty przeglądarki używają buforowanego przekierowania 301.
alfonx
alfonx: Prywatne okno nie może ponownie użyć pamięci podręcznej tylko dlatego, że właściciel serwera może używać elementów w sposób przypominający pliki cookie, ujawniając poprzednią tożsamość tego użytkownika. Chociaż muszę przyznać, że ponowne użycie bufora jest prawdopodobnie bezpieczne dla nienawidzącej pornografii żony.
Zdenek
6
To nie działa, jeśli masz już pamięć podręczną 301. Private rzeczywiście użyje przekierowania, które jest buforowane.
jeffmcneill
1

Przetestuj przekierowania w trybie incognito / InPrivate, aby po zamknięciu przeglądarki opróżnić pamięć podręczną i ponownie otworzyć okno nie będzie zawierać pamięci podręcznej.

yougotiger
źródło
1

Jak pokazują inne odpowiedzi. Buforowanie może być nieograniczone w przeglądarce. To jest bardzo niebezpieczne. Więc nie rób tego. Przynajmniej dodaj nagłówki pamięci podręcznej. W htaccess zawsze robię to w ten sposób, teraz w ogóle buforuję:

<IfModule mod_rewrite.c>
  RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
  # The E=nocache:1 sets the environment variable nocache to the value of one
  RewriteRule ^/?(.*) https://www.example.org/$1 [L,R=301,E=nocache:1]
</IfModule>


<IfModule mod_headers.c>
  ## Set the response header if the "nocache" environment variable is set
  ## in the RewriteRule above.
  Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache

  ## Set Expires too ...
  Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</IfModule>
Junzen
źródło
1

Aby rozwiązać problem dotyczący adresu localhost, zmieniłem numer portu, pod którym działała strona. To działało na Chrome w wersji 73.0.3683.86.

fightc2
źródło
-1

W najnowszej wersji Google Chrome 79 możesz użyć chrome: // net-internals i wybrać na DNS z lewego panelu, a następnie stuknąć przycisk Wyczyść pamięć podręczną hosta

Zrzut ekranu przedstawiający chrom otwierający stronę z wewnętrznymi elementami sieci

Mohammad Ersan
źródło
Nie jestem pewien, dlaczego jest to odrzucane, HTTP 301 jest problemem związanym z pamięcią podręczną hosta DNS
Mohammad Ersan