2012-02-17 13 views
8

¿Cómo evito que el navegador del cliente muestre su versión en caché para una página, de modo que siempre debe realizar un GET cuando el visitante visita la página?El navegador sigue renderizando su versión en caché. Quiero forzar siempre un GET

Estoy usando el decorador @never_cache de Django en la vista, que agrega "Cache-Control: max-age = 0" al encabezado HTTP GET. Sin embargo, cuando visito la página (en Google Chrome y Firefox, los únicos buscadores que he probado hasta ahora), la versión almacenada en caché se procesa de forma inevitable. (Confirmado por visitar la ficha Red para la solicitud, que informa "200 OK (de caché)".)

Si ahora hago clic en el botón Actualizar, va a proporcionar la fresca contenido del servidor (Red ficha de la petición dice "200 OK" y las cabeceras como se muestra a continuación)

En lugar de establecer. "Cache-control: max-age = 0" también traté de establecer el parámetro de cabecera HTTP "Expira" a ser una fecha en el pasado Esto no funcionó bien.

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

¿Si se usa "no-cache" en lugar del arreglo ¿la cuestión? Vea aquí: http://stackoverflow.com/questions/1046966/whats-the-difference-between-cache-control-max-age-0-and-no-cache No estoy seguro de cómo configurar eso desde Django. –

+0

No lo he intentado. Haciéndolo ahora ... – ram1

+0

Eso no funcionó, Graham. Establecí el encabezado Cache-Control en "no-caché" y aún así Chrome entrega la versión en caché de la página, lo que impide la solicitud GET. Una vez más, puedo hacer clic en el botón Actualizar de Chrome en este punto para obtener el contenido nuevo, pero, naturalmente, quiero evitar que los usuarios tengan que hacerlo. – ram1

Respuesta

11

En su respuesta ajustado siguientes:

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

Es la forma en Google Docs hace cumplir las páginas se actualizan en todo momento.

Luego puede jugar con él para encontrar el comportamiento ideal para sus propósitos.

+1

Perfecto, gracias! – ram1

+1

Veo que esto está forzando a Chrome a solicitar la página desde mi servidor, pero no parece que represente el HTML que se devuelve. Específicamente, tengo un valor que se agrega a un atributo en guardar. Cuando presiono el botón Atrás, veo que Chrome solicitó la página nuevamente, pero cuando inspecciono el elemento, el valor no se agrega. Sin embargo, cuando veo la fuente, veo que el valor se ha agregado correctamente al elemento. En Firefox todo funciona correctamente. – wildehahn

+0

@wildehahn Firefox funciona de forma un poco diferente: es compatible con la memoria caché back-forward. No estoy seguro de cuál es el problema aquí, pero quizás bf cache cause la diferencia que observa. –

1

¿Has probado esto en su archivo .htaccess:

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

Se puede ajustar la línea de los archivos de la altura de una página/ruta específica y también para activos específicos

Cuestiones relacionadas