2009-08-05 15 views
10

È un problema ben noto che IE memorizza troppo nella cache di html, anche quando si dà un'intestazione Cache-Control: no-cache o Last-Modified a everypage.Random Querystring per evitare la memorizzazione nella cache di IE

Questo behaiviour è davvero preoccupante quando si lavora con querystrings per ottenere informazioni dinamiche, come IE lo considera il stessa pagina (cioè .: http://example.com/?id=10) e serve la versione in cache.

L'ho risolto aggiungendo un numero casuale o un timestring alla querystring (as others have done) come questo http://example.com/?id=10&t=2009-08-06_13:12:56 che ho appena ignorato serveride.

Esiste un'opzione migliore? C'è un altro, un modo più pulito per realizzare questo? Sono consapevole del fatto che POST non è memorizzato nella cache, ma è semanticalmente corretto per utilizzare GET qui.

+0

Quello che sto chiedendo: c'è qualche * altro modo * di fare questo? – voyager

+0

La tua affermazione non è corretta, a proposito. IE non "memorizza troppo l'HTML". Vedi www.fiddler2.com/redir/?id=httpperf per la discussione sulla memorizzazione nella cache in IE. – EricLaw

+1

@Eric, IE presenta alcuni comportamenti inattesi/incoerenti [http://support.microsoft.com/kb/222064/) [relativi alla memorizzazione nella cache] (http://support.microsoft.com/kb/234067). – voyager

risposta

2

Così, alla fine, l'unico modo affidabile per fare questo (grazie a IE6) è utilizzando un random, o time bound querystring.

È possibile utilizzare un time bound querystring che cambia solo ogni 15 secondi (o qualsiasi altro periodo di tempo), in modo che ci si abbassare il numero di server ha colpito, come vedreste contenuto memorizzato nella cache localmente per quei 15 secondi.

Se hai a standard compliant browser, è possibile cavarsela con solo utilizzando ETags.

+0

Questo fallirà nuovamente se l'utente torna alla pagina usando il pulsante Indietro e fa un aggiornamento sulla pagina. Sei riuscito a trovare una soluzione sicura che funziona in tutti i casi? Grazie. – lostInTransit

+0

Genera la parte "random" della querystring con client javascript come mostrato su http://stackoverflow.com/questions/1234246/random-querystring-to-avoid-ie-caching/1234260#1234260 In questo modo, sarà diverso * ogni volta che * viene eseguito 'get' o' post'. – voyager

+0

"... (grazie a IE6) è ..." grazie anche a IE7, non ho ancora testato IE8. –

0

Ho lo stesso problema, ma attenzione, in un secondo ci possono essere molte richieste. Questo è il motivo per cui io uso questo:

$.getJSON("http://server/example?param=value&dummy=" + Math.random(), ...); 
+0

Bene, non voglio lo ** stesso client ** colpire il mio server ** diversi timer al secondo **, quindi non mi importa se l'informazione mostrata è vecchia di 1 secondo. Ovviamente, l'output è un testo semplice per gli umani. – voyager

2

utilizzando un numero casuale (non timestamp) in querystring, o addirittura cambiare il nome del file sono i due metodi raccomandati. Steve Souders e YAHOO!'s performance group hanno pubblicato un ton di informazioni e pratiche utili che hanno scoperto e sviluppato mentre ottimizzavano una delle proprietà più visitate al mondo.

6

Si potrebbe anche usare la corrente Tempo Unix in millisecondi per evitare il problema di molte richieste in un secondo (è molto meno probabilità di avere più richieste in un millisecondo)

var url = "http://whatever.com/stuff?key=value&ie=" + (new Date()).getTime(); 
0

Hai provato l'aggiunta di un ETag intestazione nella risposta? È possibile utilizzare uno a caso o un checksum della pagina generata in modo che la versione memorizzata nella cache venga pubblicata quando appropriato.

Non sono sicuro di quale sia il comportamento di IE, ma con le versioni recenti dovrebbe funzionare.

Vedere anche il HTTP RFC section on ETag

11

Supponendo che si stia utilizzando jQuery, anziché utilizzare $ .get o $ .getJson, utilizzare il più generico $ .ajax e impostare esplicitamente il valore di cache su falso.Il seguente è un esempio:

$.ajax({ 
     url: "/Controller/Action", 
     cache: false, 
     type: "GET", 
     dataType: "json", 
     success: function(data, textStatus) { 
         alert("success"); 
       } 
    }); 

Un altro codice poco richiesto (non molto però) rispetto all'utilizzo GetJSON o .get ma risolverà il problema in modo pulito senza aggiungere numeri casuali.

+0

ho scoperto che utilizzando la richiesta GET in IE dovremmo impostare di non memorizzare nella cache l'html e ho impostato 'cache: false' e questo ha impedito a IE di portare il risultato dalla cache..grazie – Lucky

Problemi correlati