2012-02-17 8 views
8

Come impedire al browser client di eseguire la sua versione cache per una pagina, in modo che debba sempre eseguire un GET quando il visitatore visita la pagina?Il browser continua a eseguire il rendering della sua versione cache. Voglio forzare sempre un GET

Sto utilizzando il decoratore @never_cache di Django nella vista, che aggiunge "Cache-Control: max-age = 0" all'intestazione GET HTTP. Tuttavia, quando visito la pagina (in Google Chrome e Firefox, gli unici browser che ho provato finora), la versione cache viene inevitabilmente resa. (Confermato visitando la scheda di rete per la richiesta, che riporta "200 OK (dalla cache)".)

Se ora si fa clic sul pulsante Aggiorna, renderà la fresca contenuto dal server (Network scheda per la richiesta dice: "200 OK" e le intestazioni come illustrato di seguito)

invece di impostazione. "cache-Control: max-age = 0" ho anche provato a installare il "scade" parametro di intestazione HTTP per essere un appuntamento nel passato Questo non ha funzionato neanche.

Request Method:GET 
Status Code:200 OK 

Request Headers 
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Cache-Control:max-age=0 
Connection:keep-alive 
If-Modified-Since:Fri, 17 Feb 2012 15:25:21 GMT 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11 

Response Headers 
Cache-Control:max-age=0 
Connection:keep-alive 
Content-Encoding:gzip 
Content-Type:text/html; charset=utf-8 
Date:Fri, 17 Feb 2012 15:55:11 GMT 
ETag:"[removed]" 
Expires:Fri, 17 Feb 2012 15:55:11 GMT 
Last-Modified:Fri, 17 Feb 2012 15:55:11 GMT 
Server:nginx 
Transfer-Encodindg:chunked 
Vary:Cookie,Accept-Encoding 
X-Handled-By:127.0.0.1:8000 
+0

costa usare "no-cache", invece fix il problema? Vedi qui: http://stackoverflow.com/questions/1046966/whats-the-difference-between-cache-control-max-age-0-and-no-cache non sai come impostare quello da Django però. –

+0

Non l'ho provato. Così facendo ... – ram1

+0

Non ha funzionato, Graham. Ho impostato l'intestazione Cache-Control su "no-cache" e ancora Chrome fornisce la versione cache della pagina, evitando la richiesta GET. Ancora una volta, posso fare clic sul pulsante Aggiorna di Chrome a questo punto per ottenere il nuovo contenuto, ma naturalmente voglio impedire agli utenti di farlo. – ram1

risposta

11

Nella tua risposta impostare questi:

response['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate' 
response['Expires'] = 'Fri, 01 Jan 2010 00:00:00 GMT' 

E 'come Google Docs applica pagine aggiornare in ogni momento.

Quindi puoi giocare con esso per trovare il comportamento ideale per i tuoi scopi.

+1

Perfetto, grazie! – ram1

+1

Posso vedere che questo sta forzando Chrome a richiedere la pagina dal mio server, ma non sembra che stia rendendo l'HTML che viene restituito. Nello specifico, ho un valore che viene aggiunto a un attributo al salvataggio. Quando premo il pulsante Indietro, vedo che Chrome ha richiesto di nuovo la pagina, ma quando controllo l'elemento, il valore non viene aggiunto. Tuttavia, quando visualizzo la fonte, vedo che il valore è stato correttamente aggiunto all'elemento. Su Firefox tutto funziona correttamente. – wildehahn

+0

@wildehahn Firefox funziona in modo leggermente diverso, supporta la cache back-forward. Non sei sicuro di quale sia il problema ma forse bf cache fa la differenza che osservi. –

1

Hai provato questo nel file .htaccess:

<FilesMatch "\.(css|gif|html|jpg|js|php|png)$"> 
Header set Cache-Control: "max-age=0, no-store" 
</FilesMatch> 

È possibile regolare la linea file partita per una specifica pagina/percorso e anche per le attività specifiche

Problemi correlati