Per quanto tempo i browser memorizzano nella cache HTTP 301s?


382

Sto eseguendo il debug di un problema con un reindirizzamento permanente HTTP 301. Dopo un rapido test, sembra che Safari cancelli la sua cache di 301s quando viene riavviato, ma Firefox non lo fa.

Quando IE, Chrome, Firefox e Safari cancellano la cache dei 301?

AGGIORNAMENTO: Ad esempio, se si desidera reindirizzare example1.coma example2.com, ma ho impostato accidentalmente il reindirizzamento su example3.com, questo è un problema. Posso correggere l'errore, ma chiunque abbia visitato example1.comnel frattempo avrà memorizzato nella cache il reindirizzamento errato example3.com, e quindi non sarà in grado di raggiungere nessuno dei due example1.como example2.comfino a quando la cache non verrà cancellata. Dopo alcune indagini, trovo che non ci sono stati Cache-Controle Expiresle intestazioni impostate. Le intestazioni per la risposta 301 errata sarebbero state così:

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

I miei test mostrano che:

  • IE7, IE8, Android 2.3.4 non memorizzano affatto nella cache.
  • Firefox 18.0.2, Safari 5.1.7 (su Windows 7) e Opera 12.14 tutta la cache e svuota la cache al riavvio del browser.
  • IE10 e Chrome 25 cache, ma non si cancellano al riavvio del browser, quindi quando verranno cancellati?

7
Per favore, dì a Chrome che abbiamo bisogno di una via d'uscita da questo buco infernale 301: bugs.chromium.org/p/chromium/issues/…
BT

@BT poiché il problema riguarda tutti i browser, in realtà solo l'IETF potrebbe risolverlo, probabilmente definendo un timeout obbligatorio sui 301 memorizzati nella cache che non hanno TTL, in modo che i browser alla fine verifichino nuovamente i loro presupposti memorizzati nella cache.
McGuireV10,

1
Ho iniziato una discussione sulla mailing list IETF su questo, se qualcuno ancora seguendo questo problema ha voglia di ponderare: lists.w3.org/Archives/Public/ietf-http-wg/2017OctDec/0363.html
McGuireV10

Risposte:


300

Almeno due browser, Chrome e Firefox, memorizzeranno nella cache un reindirizzamento 301 senza data di scadenza .

Cioè, rimarrà nella cache fino a quando la cache del browser può adattarlo. Verrà rimosso dalla cache se si cancella manualmente la cache o se le voci della cache vengono eliminate per fare spazio a quelle nuove.

Puoi verificarlo almeno in Firefox andando su about:cachee trovandolo nella cache del disco.

Non conosco il comportamento di altri browser, come IE10 / IE11. Tuttavia, dato che altri browser lo memorizzano nella cache per un tempo indefinito, dovrai comunque occuparti di questo.

In tutti i browser, incluso Chrome / Firefox, è ancora possibile ignorare questo comportamento predefinito usando le intestazioni, come descritto di seguito:

Nota: questa risposta è stata scritta nel 2014 e il comportamento del browser potrebbe cambiare nel tempo.

Se non si desidera che il reindirizzamento venga memorizzato nella cache

Questa memorizzazione nella cache indefinita è solo la memorizzazione nella cache predefinita di questi browser in assenza di intestazioni Cache-Control. La logica è che stai specificando un reindirizzamento "permanente" e non stai dando loro altre istruzioni di memorizzazione nella cache, quindi lo tratteranno come se lo volessi nella cache indefinitamente.

I browser rispettano ancora le intestazioni Cache-Control e scadono come con qualsiasi altra risposta, se specificate.

Puoi aggiungere intestazioni come Cache-Control: max-age=3600o Expires: Thu, 01 Dec 2014 16:00:00 GMTai tuoi reindirizzamenti 301. Potresti anche aggiungere in Cache-Control: no-cachemodo che non venga memorizzato nella cache in modo permanente dal browser o Cache-Control: no-storeche non possa nemmeno essere archiviato in memoria temporanea dal browser.

Un'alternativa migliore secondo me, tuttavia, è usare un reindirizzamento 302 o 307. Questi non implicano per i browser o le cache che sono reindirizzamenti "permanenti" e quindi non dovrebbero essere memorizzati nella cache in assenza delle intestazioni Cache-Control.

Per me, sembra emettere un reindirizzamento 301 ma contrassegnarlo come non memorizzabile nella cache va contro lo spirito di ciò a cui serve un reindirizzamento 301, anche se può essere tecnicamente valido. YMMV e potresti trovare casi limite in cui ha senso che un reindirizzamento "permanente" abbia un limite di tempo.

Se in precedenza hai emesso un reindirizzamento 301 ma desideri annullare l'operazione

Se le persone hanno ancora il reindirizzamento 301 memorizzato nella cache nel loro browser continueranno a essere indirizzate alla pagina di destinazione indipendentemente dal fatto che la pagina di origine abbia ancora il reindirizzamento attivo. Le opzioni per risolvere questo problema includono:

  • La soluzione più semplice e migliore è emettere nuovamente un altro reindirizzamento 301.

    Il browser si renderà conto che viene reindirizzato a quello che in precedenza pensava fosse un URL non commissionato, e ciò dovrebbe causare nuovamente il recupero di tale URL per confermare che il vecchio reindirizzamento non è ancora presente.

    Modifica: alcuni commenti mettono in dubbio questo, vedi sotto.

  • Se non hai il controllo del sito in cui è stato indirizzato il target di reindirizzamento precedente, sei sfortunato. Prova a chiedere al proprietario del sito di reindirizzare a te.

Anche prevenire è meglio che curare: evita un reindirizzamento 301 se non sei sicuro di voler rimuovere definitivamente la commissione dal vecchio URL.


18
Inoltre, hai riferimenti che mostrano che i browser gestiscono reindirizzamenti permanenti circolari recuperando l'URL originale?
Kevin Christopher Henry,

7
301 reindirizzamento indietro non funziona, il browser memorizza ancora il vecchio reindirizzamento 301 e vedo loop infinito
Yuriy Kolodovskyy

5
come ho fatto prova: qualche tempo fa ho fatto fare redirect 301 per http://www.SOMEHOST.coma https://www.SOMEHOST.com. Ma ora http://www.SOMEHOST.comdeve essere l'host principale per il sito. Quindi, reindirizzamento da https a http rimosso. Come vedi, ho fatto reindirizzare 301 da https://www.SOMEHOST.coma http://www.SOMEHOST.com, ma vedi loop. Browser non ha recuperato di nuovo ...
Yuriy Kolodovskyy

8
Confermo che il reindirizzamento indietro (con un reindirizzamento PHP nel mio caso) funziona perfettamente su Google Chrome purché (ovviamente) tu abbia rimosso il reindirizzamento 301 iniziale.
Vincent Poirier,

15
Posso confermare che il reindirizzamento indietro funziona perfettamente. I browser che visualizzano il ciclo di reindirizzamento invalidano le voci della cache. Testato su IE11, Firefox 52, Safari 10, Chrome 57.
Munhitsu

258

Da Chrome 71

Per cancellare un reindirizzamento permanente, vai su chrome: // settings / clearBrowserData e da lì solo la cancellazione di "immagini e file memorizzati nella cache" ha cancellato il reindirizzamento.

Chrome 48-70

Vai a chrome: // net-internals. A destra della barra di stato rossa in alto, fai clic sulla freccia giù ▼ per aprire il menu a discesa e sotto il gruppo "Strumenti", scegli "Svuota cache".

A partire dalla versione 48, questa è stata l'unica cosa che ha funzionato per me per cancellare un 301 memorizzato nella cache.


14
A partire dalla versione 54 di Chrome, questo purtroppo non funziona per me.
pwagner,

4
Ripensandoci, non ho davvero risposto alla vera domanda "Per quanto tempo i browser memorizzano nella cache un 301" e la mia risposta non aiuterebbe nessuno che ha reindirizzato un sito pubblico in cui probabilmente hai bisogno di un modo per annullare definitivamente un 301 senza sapere quanti browser allo stato brado hanno memorizzato nella cache il reindirizzamento - altre risposte affrontano parzialmente quello scenario. La mia risposta è davvero utile solo agli sviluppatori o agli scenari intranet in cui è possibile comunicare con tutti gli utenti interessati.
McGuireV10

1
Funziona in Chrome versione 68.0.3440.106 (build ufficiale)
Thum Choon Tat

12
chrome: // net-internals è stato sventrato in Chrome 71. La sezione a discesa / Strumenti è sparita. C'è un DNS> cache risolutore host> pulsante Cancella cache host, ma questo non funziona per rimuovere i 301 memorizzati nella cache.
t-jam

52
In Chrome 71, chrome: // settings / clearBrowserData e da lì solo la cancellazione di "immagini e file memorizzati nella cache" ha cancellato il reindirizzamento.
Bemmu,

179

Una risposta che aiuta coloro che desiderano disperatamente sbarazzarsi della cache di reindirizzamento:

Chrome memorizza nella cache il reindirizzamento 301 all'infinito (nella cache del disco locale). Per cancellare questa cache:

  • apri il tuo DevTools (premi F12)
  • sulla rete scheda controllare la "Disattiva cache" casella di controllo
  • tenere DevTools aperto e ricaricare la pagina (premere F5)

Quando tutto va bene, puoi deselezionare "Disabilita cache" e tutto continuerà a funzionare come previsto.


14
Funziona e anche dopo aver riattivato la memorizzazione nella cache il reindirizzamento è sparito. GRAZIE!
migg,

2
Sembra che questo non funzioni per i domini puntati a 127.0.0.1 tramite il file hosts locale. C'è qualche altra opzione per questo caso?
pwagner,

Non funziona se il reindirizzamento, involontariamente, punta a un'altra porta, come da localhost:8000a localhost(porta 80). Ho anche cancellato l'intero sito / i dati dell'applicazione sia da localhost che da localhost: 8000, ma nessuno di questi ha aiutato.
Dennis98,

3
Questa soluzione funziona su Chrome a partire dal 16 novembre 2019 versione 78.0.3904.97. Le altre soluzioni non sono più disponibili. Dopo averlo fatto funzionare puoi chiudere gli strumenti di sviluppo e continuerà a funzionare correttamente.
Peter Wooster,

Risposta accettata
Aysennoussi,

43

Fai in modo che l'utente invii un modulo di post su quell'URL e il reindirizzamento memorizzato nella cache è sparito :)

<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
    <input type="submit" value="fix" />
</form>
</body>

2
Sono d'accordo che questo è il metodo migliore che ho trovato per svitarlo.
esjay,

a differenza di altre risposte, questo metodo è adatto per risolvere il problema di altre persone senza aprire la console degli sviluppatori! grazie
Alexey Rytikov,

4
fetch ('URL', {method: 'POST'}) oughta deve fare il trucco allo stesso modo. Grazie! Questo mi ha risparmiato un po 'di mal di testa!
calvin,

Non riesco a credere che questo sia l'unico modo che ha funzionato per me (ho provato prima tutti gli altri metodi - anche la console fetch () non è riuscita a causa di una politica di sicurezza tra siti).
user36388

24

301è una risposta memorizzabile nella cache per RFC HTTP e i browser la memorizzeranno nella cache in base alle intestazioni della cache HTTP presenti nella risposta. Utilizzare FireBug o Charles per esaminare le intestazioni di risposta per conoscere la durata esatta della memorizzazione nella cache della risposta.

Se desideri controllare la durata della memorizzazione nella cache, puoi utilizzare le intestazioni della risposta HTTP Cache-Controle Expiresfare lo stesso. In alternativa, se non si desidera memorizzare nella cache la 301risposta, utilizzare le seguenti intestazioni.

Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT

12
Sebbene tecnicamente corretta, la tua risposta non risponde alla domanda degli utenti e quindi non risponde alla domanda per cui sono venuto qui. Quando scadono i 301 esistenti non memorizzati nella cache delle intestazioni già nel browser per i browser principali?
derubare l'

Se qualcuno è ancora interessato, queste istruzioni di collegamento possono attivare / disattivare la cache per 301.
Francisco Presencia,

Il link è per FF e non ha funzionato per me. Estensione di sviluppo web 1.2.5 installata e utilizzo di FF 23.0.1
un phu il

alla domanda non è stata data risposta. La domanda era: per quanto tempo verrà memorizzato nella cache il reindirizzamento se non viene specificata una data di scadenza
Dennis Flagg

22

Esiste un modo molto semplice per rimuovere la cache del browser per i reindirizzamenti http, ad es. 301, 307 ecc.

Puoi aprire il pannello di rete nella console per sviluppatori in Chrome. Seleziona la chiamata di rete. Fai clic destro su di esso e quindi fai clic su Cancella cache del browser per rimuovere il reindirizzamento memorizzato nella cache.

menu di scelta rapida delle chiamate di rete


1
Grazie mille! Soluzione semplice e funzionata! In questo modo dovrebbe funzionare anche in futuro.
sgon00,

16

Confermato!! fai in modo che l'utente invii una richiesta di post all'URL interessato e il reindirizzamento nella cache viene dimenticato.

Una rapida vittoria sarebbe quella di inserire questo nella console del browser se è possibile:

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

Utile se conosci il browser interessato (specialmente durante lo sviluppo).

In alternativa , se hai accesso alla pagina di reindirizzamento 301 precedente, puoi aggiungere questo script alla pagina e ogni volta che viene visitato, il 301 memorizzato nella cache verrà dimenticato.


Questo è simile al modulo di posta sopra, solo che è meno sforzo.
jpswade,

È corretto @jpswade
Emeke Ajeh

12

Pubblicherò una risposta che mi ha aiutato:

vai a url:

chrome://settings/clearBrowserData

dovrebbe invocare popup e quindi ..

  • selezionare solo: cached images and files.
  • selezionare la casella temporale: from beginning

Lavorare in Chrome 79!
webaholik,

Lavorando in Chrome 80, grazie!
Joseph

6

come risposta di @thomasrutter

Se in precedenza hai emesso un reindirizzamento 301 ma desideri annullare l'operazione

Se le persone hanno ancora il reindirizzamento 301 memorizzato nella cache nel loro browser continueranno a essere indirizzate alla pagina di destinazione indipendentemente dal fatto che la pagina di origine abbia ancora il reindirizzamento attivo. Le opzioni per risolvere questo problema includono:

La soluzione più semplice e migliore è emettere nuovamente un altro reindirizzamento 301.

Il browser si renderà conto che viene reindirizzato a quello che in precedenza pensava fosse un URL disattivato, e ciò dovrebbe causare nuovamente il recupero dell'URL per confermare che il vecchio reindirizzamento non è ancora presente.

Se non hai il controllo del sito in cui è stato indirizzato il target di reindirizzamento precedente, sei sfortunato. Prova a chiedere al proprietario del sito di reindirizzare a te.

In realtà, questo significa:

  1. da a.com 301 a b.com

  2. elimina 301 di a.com

  3. aggiungi b.com 301 a a.com

Quindi funziona.


2
Ma poi hai ancora 301 di b.com in giro: (- una correzione sporca
BT

1
Puoi cancellare un reindirizzamento emettendo altri 301 da una pagina diversa ? ad es. ( a.com301 -> b.com) (elimina a.com301) (aggiungi a.com/abcdefg301 -> a.com) e imponi al client di visualizzarlo in a.com/abcdefgqualche modo?
nemec,

Grazie funziona! Testato su IE11, Firefox 52, Safari 10, Chrome 57
Munhitsu,

Ho avuto una situazione in cui volevo usare sia a.com che b.com. Quindi b.com 301 a.com non era un'opzione. La nostra soluzione era passare a HTTPS - non avevamo reindirizzamenti su HTTPS
rosell.dk

6

Ho una soluzione semplice che ha funzionato su tutti i principali browser (ultima versione), include IE, Chrome e FF

  1. Ctrl + Maiusc + Canc
  2. -
    1. Chrome: seleziona "Cronologia esplorazioni" e "Cache ..."
    2. IE: lascio l'opzione predefinita "File temporanei Internet e file di siti Web", "Cookie e dati di siti Web", "Cronologia"
    3. FF: "Cronologia esplorazioni e download", "Cache"
  3. Fai clic su "Elimina"
  4. Chiudi e riapri il browser. Dovrebbe funzionare

Dovresti anche assicurarti di non essere nella pagina in questione, perché alcuni browser non cancellano gli elementi memorizzati nella cache dalle pagine aperte.
Oliver Schimmer,

6

A scopo di test (per evitare reindirizzamenti memorizzati nella cache), le persone possono aprire NUOVA FINESTRA PRIVATA : fare clic su CTRL+SHIFT+N[se si utilizza Mozilla, utilizzare P]


Questo è stato ridimensionato, probabilmente perché la principale promessa della "finestra privata" non è quella di SCRIVERE alle cache, ma può comunque leggerle / riutilizzarle. MA per me su Firefox 37.0.1 (Linux) ha funzionato ed è stato molto rapido e utile. La finestra privata riflette le impostazioni correnti / non memorizzate nel web server, mentre le normali schede del browser utilizzano un reindirizzamento 301 memorizzato nella cache.
alfonx,

alfonx: la finestra privata non può riutilizzare la cache semplicemente perché il proprietario del server potrebbe utilizzare gli elementi in modo cookie rivelando l'identità precedente dell'utente. Anche se devo ammettere che il riutilizzo della cache è probabilmente sicuro contro una moglie che odia il porno.
Zdenek,

6
Ciò non funziona se si dispone già di un 301 memorizzato nella cache. Private utilizzerà effettivamente il reindirizzamento memorizzato nella cache.
jeffmcneill,

1

Metti alla prova i tuoi reindirizzamenti utilizzando la modalità di navigazione in incognito / InPrivate in modo che quando chiudi il browser svuota quella cache e riaprendo la finestra non conterrà la cache.


1

Come mostrano le altre risposte. La memorizzazione nella cache può essere indefinitamente nel browser. Questo è estremamente pericoloso. Quindi non farlo. Almeno aggiungi le intestazioni della cache. In htaccess lo faccio sempre in questo modo con ora la memorizzazione nella cache a tutti:

<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>

1

Per risolvere il problema relativo a un indirizzo localhost ho modificato il numero di porta con cui il sito funzionava. Funzionava con la versione di Chrome 73.0.3683.86.


-1

Nell'ultima versione di Google Chrome 79, puoi utilizzare chrome: // net-internals e selezionare su DNS dal pannello di sinistra, quindi toccare il pulsante Cancella cache host

Schermata di Chrome che apre la pagina net-internals


Non sono sicuro del motivo per cui questo è stato sottoposto a downgrade, Http 301 è un problema relativo alla cache dell'host DNS
Mohammad Ersan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.