Wie lange zwischenspeichern Browser HTTP 301s?

380

Ich debugge ein Problem mit einer permanenten HTTP 301-Umleitung. Nach einem kurzen Test scheint Safari beim Neustart den Cache von 301 Sekunden zu leeren, Firefox jedoch nicht.

Wann leeren IE, Chrome, Firefox und Safari ihren 301-Cache?

UPDATE: Zum Beispiel, wenn ich umleiten mag example1.comzu example2.com, aber ich versehentlich gesetzt zu umleiten example3.com, das ist ein Problem. Ich kann den Fehler korrigieren, aber jeder, der example1.comin der Zwischenzeit besucht hat, hat die falsche Weiterleitung zwischengespeichert example3.com, sodass er weder erreichen kann, example1.comnoch example2.combis sein Cache geleert ist. Bei der Untersuchung stelle ich fest, dass keine Cache-Controlund ExpiresHeader gesetzt wurden. Die Header für die falsche 301-Antwort wären wie folgt gewesen:

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

Meine eigenen Tests zeigen, dass:

  • IE7, IE8, Android 2.3.4 werden überhaupt nicht zwischengespeichert.
  • Firefox 18.0.2, Safari 5.1.7 (unter Windows 7) und Opera 12.14 alle Cache und löschen Sie den Cache beim Neustart des Browsers.
  • IE10- und Chrome 25-Cache, aber beim Neustart des Browsers nicht gelöscht. Wann werden sie gelöscht ?
Liam
quelle
7
Bitte sagen Sie Chrome, dass wir einen Ausweg aus diesem Höllenloch
BT
@BT Da das Problem alle Browser betrifft, konnte dies tatsächlich nur von der IETF behoben werden, wahrscheinlich durch Definieren eines obligatorischen Zeitlimits für zwischengespeicherte 301s ohne TTL, sodass Browser ihre zwischengespeicherten Annahmen schließlich erneut überprüfen würden.
McGuireV10
1
Ich habe eine Diskussion über die IETF-Mailingliste darüber begonnen, wenn jemand, der dieses Problem noch verfolgt, Lust hat, sich zu
beschweren

Antworten:

299

Mindestens zwei Browser - Chrome und Firefox - speichern eine 301-Weiterleitung ohne Ablaufdatum zwischen .

Das heißt, es bleibt so lange zwischengespeichert, wie der Cache des Browsers es aufnehmen kann. Es wird aus dem Cache entfernt, wenn Sie den Cache manuell leeren oder wenn die Cache-Einträge gelöscht werden, um Platz für neue zu schaffen.

Sie können dies zumindest in Firefox überprüfen, about:cacheindem Sie es im Festplatten-Cache aufrufen und suchen.

Ich weiß nichts über das Verhalten anderer Browser wie IE10 / IE11. Da andere Browser es jedoch auf unbestimmte Zeit zwischenspeichern, müssen Sie dies trotzdem berücksichtigen.

In allen Browsern, einschließlich Chrome / Firefox, ist es weiterhin möglich, dieses Standardverhalten mithilfe von Headern zu überschreiben, wie unten beschrieben:

Hinweis: Diese Antwort wurde 2014 geschrieben und das Verhalten des Browsers kann sich im Laufe der Zeit ändern.

Wenn Sie nicht möchten, dass die Umleitung zwischengespeichert wird

Dieses unbestimmte Caching ist nur das Standard- Caching dieser Browser, wenn keine Cache-Control-Header vorhanden sind. Die Logik ist, dass Sie eine "permanente" Umleitung angeben und ihnen keine anderen Caching-Anweisungen geben, sodass sie diese so behandeln, als ob Sie sie auf unbestimmte Zeit zwischengespeichert haben möchten.

Die Browser berücksichtigen weiterhin die Cache-Control- und Expires-Header wie bei jeder anderen Antwort, sofern sie angegeben sind.

Sie können Header wie Cache-Control: max-age=3600oder Expires: Thu, 01 Dec 2014 16:00:00 GMTzu Ihren 301-Weiterleitungen hinzufügen . Sie können sogar hinzufügen, Cache-Control: no-cachedamit es nicht dauerhaft vom Browser zwischengespeichert wird oder vom Browser Cache-Control: no-storenicht einmal vorübergehend gespeichert werden kann.

Eine bessere Alternative ist meiner Meinung nach jedoch die Verwendung einer 302- oder 307-Umleitung. Diese bedeuten für Browser oder Caches nicht, dass es sich um "permanente" Weiterleitungen handelt, und sollten daher nicht zwischengespeichert werden, wenn keine Cache-Control-Header vorhanden sind.

Für mich scheint es, als würde eine 301-Weiterleitung ausgegeben, aber wenn sie als nicht zwischenspeicherbar markiert wird, widerspricht dies dem Geist einer 301-Weiterleitung, auch wenn sie technisch gültig sein kann. YMMV, und Sie können Randfälle finden, in denen es sinnvoll ist, dass eine "permanente" Umleitung ein Zeitlimit hat.

Wenn Sie zuvor eine 301-Umleitung ausgegeben haben, dies aber deaktivieren möchten

Wenn Benutzer die zwischengespeicherte 301-Weiterleitung noch in ihrem Browser haben, werden sie weiterhin zur Zielseite weitergeleitet, unabhängig davon, ob auf der Quellseite die Weiterleitung noch vorhanden ist. Ihre Optionen zur Behebung dieses Problems umfassen:

  • Die einfachste und beste Lösung besteht darin, eine weitere 301-Umleitung erneut auszugeben.

    Der Browser erkennt, dass er zu einer zuvor nicht in Betrieb genommenen URL zurückgeleitet wird. Dies sollte dazu führen, dass diese URL erneut abgerufen wird, um zu bestätigen, dass die alte Weiterleitung noch nicht vorhanden ist.

    Bearbeiten: Einige Kommentare werfen Zweifel auf, siehe unten.

  • Wenn Sie keine Kontrolle über die Site haben, zu der das vorherige Weiterleitungsziel gegangen ist, haben Sie kein Glück. Versuchen Sie, den Websitebesitzer zu bitten, zu Ihnen zurückzuleiten.

Auch Vorbeugen ist besser als Heilen - vermeiden Sie eine 301-Weiterleitung, wenn Sie nicht sicher sind, ob Sie die alte URL dauerhaft außer Betrieb setzen möchten.

thomasrutter
quelle
18
Haben Sie auch Referenzen, die zeigen, dass Browser zirkuläre permanente Weiterleitungen verarbeiten, indem sie die ursprüngliche URL erneut abrufen?
Kevin Christopher Henry
7
301 Redirect zurück funktioniert nicht, Browser zwischenspeichert immer noch alte 301 Redirect und ich sehe Endlosschleife
Yuriy Kolodovskyy
5
wie ich tat Test: vor einiger Zeit ich für 301 - Weiterleitung machen tat http://www.SOMEHOST.comzu https://www.SOMEHOST.com. Aber jetzt http://www.SOMEHOST.commuss primärer Host für die Site sein. Umleiten von https nach http entfernt. Wie Sie zeigen, habe ich 301 von https://www.SOMEHOST.comnach umgeleitet http://www.SOMEHOST.com, aber siehe Schleife. Browser hat nicht erneut
abgerufen
8
Ich bestätige, dass die Rückleitung (in meinem Fall mit einer PHP-Umleitung) in Google Chrome einwandfrei funktioniert, solange Sie (offensichtlich) die ursprüngliche 301-Weiterleitung entfernt haben.
Vincent Poirier
15
Ich kann bestätigen, dass die Rückleitung einwandfrei funktioniert. Browser, die eine Umleitungsschleife sehen, machen die Cache-Einträge ungültig. Getestet auf IE11, Firefox 52, Safari 10, Chrome 57.
Munhitsu
258

Aus Chrome 71

Um eine permanente Umleitung zu löschen, gehen Sie zu chrome: // settings / clearBrowserData und löschen Sie von dort nur die Umleitung, indem Sie "zwischengespeicherte Bilder und Dateien" löschen.

Chrome 48-70

Gehen Sie zu chrome: // net-internals. Klicken Sie rechts in der oberen roten Statusleiste auf den Abwärtspfeil ▼, um das Dropdown-Menü zu öffnen, und wählen Sie in der Gruppe "Extras" die Option "Cache löschen".

Ab Version 48 war dies das einzige, was für mich funktioniert hat, um einen zwischengespeicherten 301 zu löschen.

McGuireV10
quelle
14
Ab Chrome Version 54 funktioniert dies bei mir leider nicht.
Pwagner
4
Beim zweiten Gedanken habe ich die eigentliche Frage "Wie lange zwischenspeichern Browser eine 301 zwischen" nicht wirklich beantwortet , und meine Antwort würde niemandem helfen, der eine öffentlich zugängliche Site umgeleitet hat, auf der Sie wahrscheinlich eine Möglichkeit benötigen, eine 301 dauerhaft rückgängig zu machen ohne zu wissen, wie viele Browser in freier Wildbahn die Weiterleitung zwischengespeichert haben - andere Antworten befassen sich teilweise mit diesem Szenario. Meine Antwort ist wirklich nur für Entwickler oder Intranetszenarien nützlich, in denen Sie mit allen betroffenen Benutzern kommunizieren können.
McGuireV10
1
Funktioniert in Chrome Version 68.0.3440.106 (Official Build)
Thum Choon Tat
12
chrome: // net-internals wurde in Chrome 71 entkernt. Der Dropdown-Bereich / Tools ist nicht mehr vorhanden. Es gibt eine Schaltfläche DNS> Host-Resolver-Cache> Host-Cache löschen, dies funktioniert jedoch nicht, um zwischengespeicherte 301s zu entfernen.
T-Jam
52
In Chrome 71 löschte chrome: // settings / clearBrowserData und von dort nur das Löschen von "zwischengespeicherten Bildern und Dateien" die Umleitung.
Bemmu
179

Eine Antwort, die denjenigen hilft, die den Redirect-Cache unbedingt loswerden möchten:

Chrome speichert die 301-Umleitung unendlich zwischen (im lokalen Festplatten-Cache). So löschen Sie diesen Cache:

  • Öffnen Sie Ihre DevTools (drücken Sie F12)
  • auf den Netzwerk - Registerkarte überprüfen Sie die „Disable Cache“ Checkbox
  • Lassen Sie DevTools geöffnet und laden Sie die Seite neu (drücken Sie F5)

Wenn alles in Ordnung ist, können Sie "Cache deaktivieren" deaktivieren und alles funktioniert wie erwartet weiter.

Olaf
quelle
14
Dies funktioniert und auch nach dem erneuten Aktivieren des Cachings ist die Umleitung weg. DANKE!
Migg
2
Es sieht so aus, als würde dies nicht für Domains funktionieren, auf die über die lokale Hosts-Datei auf 127.0.0.1 verwiesen wird. Gibt es eine andere Option für diesen Fall?
Pwagner
Funktioniert nicht, wenn die Umleitung unbeabsichtigt auf einen anderen Port verweist, z. B. von localhost:8000bis localhost(Port 80). Ich habe auch die gesamten Site- / Anwendungsdaten von localhost und localhost: 8000 gelöscht, aber dies hat auch nicht geholfen.
Dennis98
3
Diese Lösung funktioniert unter Chrome ab dem 16. November 2019, Version 78.0.3904.97. Die anderen Lösungen sind nicht mehr verfügbar. Nachdem Sie es zum Laufen gebracht haben, können Sie die Entwicklertools schließen und es funktioniert weiterhin ordnungsgemäß.
Peter Wooster
Akzeptierte Antwort.
Aysennoussi
43

Lassen Sie den Benutzer ein Post-Formular für diese URL senden und die zwischengespeicherte Weiterleitung ist weg :)

<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
quelle
2
Ich bin damit einverstanden, dass dies die beste Methode ist, die ich gefunden habe, um sie abzuschrauben.
Esjay
Im Gegensatz zu anderen Antworten eignet sich diese Methode zur Lösung des Problems anderer Personen, ohne die Entwicklerkonsole zu öffnen! Vielen Dank
Alexey Rytikov
4
fetch ('URL', {method: 'POST'}) sollte den Trick auf die gleiche Weise ausführen. Vielen Dank! Das hat mir Kopfschmerzen erspart!
Calvin
Ich kann nicht glauben, dass dies der einzige Weg ist, der für mich funktioniert hat (ich habe zuerst alle anderen Methoden ausprobiert - sogar die Konsole fetch () ist aufgrund einer standortübergreifenden Sicherheitsrichtlinie fehlgeschlagen).
user36388
24

301ist eine zwischenspeicherbare Antwort pro HTTP-RFC, die von Browsern abhängig von den HTTP-Caching-Headern zwischengespeichert wird, die Sie in der Antwort haben. Verwenden Sie FireBug oder Charles, um die Antwortheader zu untersuchen und die genaue Dauer zu ermitteln, für die die Antwort zwischengespeichert wird.

Wenn Sie die Caching-Dauer steuern möchten, können Sie die HTTP-Antwortheader verwenden Cache-Controlund Expiresdasselbe tun. Wenn Sie die 301Antwort überhaupt nicht zwischenspeichern möchten, verwenden Sie alternativ die folgenden Header.

Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Alex J.
quelle
12
Obwohl technisch korrekt, beantwortet Ihre Antwort nicht die Frage des Benutzers und daher auch nicht die Frage, für die ich hierher gekommen bin. Wann laufen bereits im Browser vorhandene, nicht im Cache befindliche 301s ohne Header für die Hauptbrowser ab?
Rob
Wenn noch jemand interessiert ist, können diese Link- Anweisungen den Cache für 301 umschalten.
Francisco Presencia
Der Link ist für FF und hat bei mir nicht funktioniert. Installierte Webentwickler-Erweiterung 1.2.5 und mit FF 23.0.1
ein
Die Frage wurde nicht beantwortet. Die Frage war, wie lange die Umleitung zwischengespeichert wird, wenn kein Ablaufdatum angegeben wurde
Dennis Flagg
21

Es gibt eine sehr einfache Möglichkeit, den Browser-Cache für http-Weiterleitungen zu entfernen, z. B. 301, 307 usw.

Sie können das Netzwerkfenster in der Entwicklerkonsole in Chrome öffnen. Wählen Sie den Netzwerkanruf aus. Klicken Sie mit der rechten Maustaste darauf und klicken Sie dann auf Browser-Cache löschen , um die zwischengespeicherte Umleitung zu entfernen.

Kontextmenü für Netzwerkanrufe

Rajesh Paul
quelle
1
Vielen Dank! Einfache Lösung und funktioniert! Dieser Weg sollte auch in Zukunft funktionieren.
sgon00
16

Bestätigt!! Lassen Sie den Benutzer eine Post-Anfrage an die betroffene URL senden, und die zwischengespeicherte Weiterleitung wird vergessen.

Ein schneller Gewinn wäre, dies in die Browserkonsole einzugeben, wenn Sie können:

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

Nützlich, wenn Sie den betroffenen Browser kennen (insbesondere während der Entwicklung).

Wenn Sie alternativ Zugriff auf die vorherige 301-Umleitungsseite haben, können Sie dieses Skript zur Seite hinzufügen. Bei jedem Besuch wird die zwischengespeicherte 301 vergessen.

Emeke Ajeh
quelle
Dies ähnelt dem obigen Post-Formular, nur ist es weniger Aufwand.
jpswade
Das ist richtig @jpswade
Emeke Ajeh
12

Ich werde eine Antwort posten, die mir geholfen hat:

gehe zur URL:

chrome://settings/clearBrowserData

es sollte Popup aufrufen und dann ..

  • nur auswählen : cached images and files.
  • Zeitfeld auswählen: from beginning
John Tribe
quelle
Arbeiten in Chrome 79!
Webaholik
Arbeiten in Chrome 80, danke!
Joseph
6

als Antwort von @thomasrutter

Wenn Sie zuvor eine 301-Umleitung ausgegeben haben, dies aber deaktivieren möchten

Wenn Benutzer die zwischengespeicherte 301-Weiterleitung noch in ihrem Browser haben, werden sie weiterhin zur Zielseite weitergeleitet, unabhängig davon, ob auf der Quellseite die Weiterleitung noch vorhanden ist. Ihre Optionen zur Behebung dieses Problems umfassen:

Die einfachste und beste Lösung besteht darin, eine weitere 301-Umleitung erneut auszugeben.

Der Browser erkennt, dass er zu einer zuvor stillgelegten URL zurückgeleitet wird. Dies sollte dazu führen, dass diese URL erneut abgerufen wird, um zu bestätigen, dass die alte Weiterleitung noch nicht vorhanden ist.

Wenn Sie keine Kontrolle über die Site haben, zu der das vorherige Weiterleitungsziel gegangen ist, haben Sie kein Glück. Versuchen Sie, den Websitebesitzer zu bitten, zu Ihnen zurückzuleiten.

In der Tat bedeutet dies:

  1. a.com 301 bis b.com

  2. Löschen Sie die 301 von a.com

  3. füge b.com 301 zu a.com hinzu

Dann funktioniert es.

Phil Han
quelle
2
Aber dann haben Sie immer noch die 301 von b.com herumliegen: (- eine schmutzige Lösung
BT
1
Können Sie eine Weiterleitung löschen, indem Sie eine weitere 301 von einer anderen Seite ausgeben ? zB ( a.com301 -> b.com) ( a.com301 löschen ) ( a.com/abcdefg301 -> hinzufügen a.com) und den Client zwingen, a.com/abcdefgirgendwie anzuzeigen ?
Nemec
Danke, es funktioniert! Getestet auf IE11, Firefox 52, Safari 10, Chrome 57
Munhitsu
Ich hatte eine Situation, in der ich sowohl a.com als auch b.com verwenden wollte. B.com 301 a.com war also keine Option. Unsere Lösung bestand darin, zu HTTPS zu wechseln - wir hatten keine Weiterleitungen zu HTTPS
rosell.dk
6

Ich habe eine einfache Lösung, die auf allen gängigen Browsern (neueste Version) funktioniert, einschließlich IE, Chrome und FF

  1. Strg + Umschalt + Entf
  2. - -
    1. Chrome: Wählen Sie "Browserverlauf" und "Cache ..."
    2. IE: Ich lasse die Standardoption "Temporäre Internetdateien und Website-Dateien", "Cookies und Website-Daten", "Verlauf".
    3. FF: "Browserverlauf und Download-Verlauf", "Cache"
  3. Klicken Sie auf "Löschen"
  4. Schließen Sie Ihren Browser und öffnen Sie ihn erneut. Es sollte funktionieren
Mist Le
quelle
Sie sollten auch sicherstellen, dass Sie sich nicht auf der betreffenden Seite befinden, da einige Browser zwischengespeicherte Elemente nicht von geöffneten Seiten löschen.
Oliver Schimmer
6

Zu Testzwecken (um zwischengespeicherte Weiterleitungen zu vermeiden) können Benutzer das NEUE PRIVATE FENSTER öffnen : Klicken Sie auf CTRL+SHIFT+N[Wenn Sie Mozilla verwenden, verwenden Sie P]

T.Todua
quelle
Dies wurde herabgestuft, wahrscheinlich weil das Hauptversprechen des "privaten Fensters" nicht darin besteht, in Caches zu schreiben, sondern sie trotzdem LESEN / WIEDERVERWENDEN kann. ABER für mich unter Firefox 37.0.1 (Linux) hat dies funktioniert und war sehr schnell und nützlich. Das private Fenster spiegelt die aktuellen / nicht zwischengespeicherten Einstellungen des Webservers wider, während die normalen Browser-Registerkarten eine zwischengespeicherte 301-Umleitung verwenden.
Alfonx
alfonx: Das private Fenster kann den Cache möglicherweise nicht wiederverwenden, nur weil der Serverbesitzer die Elemente in einer Cookie-Weise verwenden könnte, die die vorherige Identität des Benutzers enthüllt. Obwohl ich zugeben muss, dass die Wiederverwendung des Caches wahrscheinlich gegen eine pornohassende Frau sicher ist.
Zdenek
6
Dies funktioniert nicht, wenn Sie bereits eine zwischengespeicherte 301 haben. Private verwendet tatsächlich die zwischengespeicherte Umleitung.
Jeffmcneill
1

Testen Sie Ihre Weiterleitungen im Inkognito / InPrivate-Modus. Wenn Sie den Browser schließen, wird der Cache geleert und das erneute Öffnen des Fensters enthält den Cache nicht.

yougotiger
quelle
1

Wie die anderen Antworten zeigen. Das Caching kann im Browser auf unbestimmte Zeit erfolgen. Das ist extrem gefährlich. Also tu es nicht. Fügen Sie mindestens Cache-Header hinzu. In htaccess mache ich es immer so, indem ich jetzt überhaupt zwischenspeichere:

<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>
Yunzen
quelle
1

Um das Problem mit einer lokalen Hostadresse zu lösen, habe ich die Portnummer geändert, unter der die Site ausgeführt wurde. Dies funktionierte unter Chrome Version 73.0.3683.86.

Combatc2
quelle
-1

In der neuesten Google Chrome-Version 79 können Sie chrome: // net-internals verwenden und im linken Bereich DNS auswählen und dann auf die Schaltfläche Host-Cache löschen tippen

Screenshot von Chrome beim Öffnen der Net-Internals-Seite

Mohammad Ersan
quelle
Nicht sicher, warum dies herabgestuft wird, Http 301 ist ein Problem im Zusammenhang mit dem DNS-Host-Cache
Mohammad Ersan