2009-06-25 15 views
19

Tengo una situación en la que mi servidor web (incrustado) está enviando el encabezado Expires, pero el navegador no parece respetar la configuración del encabezado, es decir, si actualizo la página, el navegador solicita los recursos que se supone deben almacenarse en caché. Los siguientes son los encabezados que están siendo intercambiados:¿El encabezado de HTTP Expires no es respetado por el navegador?

 
https://192.168.1.180/scgi-bin/ajax/ajax.cgi 

GET /scgi-bin/ajax/ajax.cgi HTTP/1.1 
Host: 192.168.1.180 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729) 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Cache-Control: max-age=0 

HTTP/1.x 200 OK 
Date: Wed, 24 Jun 2009 20:26:47 GMT 
Server: Embedded HTTP Server. 
Connection: close 
Content-Type: text/html 
---------------------------------------------------------- 
https://192.168.1.180/scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 

GET /scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 HTTP/1.1 
Host: 192.168.1.180 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729) 
Accept: image/png,image/*;q=0.8,*/*;q=0.5 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: https://192.168.1.180/scgi-bin/ajax/ajax.cgi 
Cache-Control: max-age=0 

HTTP/1.x 200 OK 
Date: Wed, 24 Jun 2009 20:26:47 GMT 
Server: Embedded HTTP Server. 
Connection: close 
Expires: Wed, 1 Jun 2011 20:00:00 GMT 
Content-Type: image/jpg 
---------------------------------------------------------- 

El ajax.cgi devuelve una página HTML con un logotipo gráfico (a través de la secuencia de comandos static.cgi), lo que me gustaría en caché, pero el navegador está pidiendo el logo en cada refresco

+0

veo que está trabajando a través de HTTPS. ¿Podría ser esa la razón por la que no se realiza el almacenamiento en caché como lo esperabas? ¿Puedes probar una versión solo HTTP? – mark

Respuesta

13

¿Qué haces en tu navegador? Parece que haces clic en el botón de recarga o incluso algo así como cambiar + Recargar. Normalmente, el navegador no enviaría un encabezado Cache-Control: max-age=0. Eso significa que el navegador ha descartado la imagen en caché y quiere obtenerla de nuevo.

Si solo navega a otra página y luego vuelve otra vez, el navegador debe respetar su encabezado Expira.

Además, puede agregar un encabezado Cache-control: public a su respuesta. Eso permite que los proxies y el navegador explícitamente almacenen en caché la imagen.

+1

Esto parece correcto. El navegador (¿Firefox?) Está enviando max-age = 0, lo que significa que no quiere ninguna respuesta anterior a los 0, es decir, quiere acceder al servidor web de origen. Esta es la definición de "actualizar". Navegue fuera de su página, pegue la URL nuevamente y vea qué sucede. –

+0

De hecho, estaba haciendo una recarga de página, y esperaba que el navegador volviera a cargar el html pero no todos los recursos en caché. Pensé que tenía que hacer un clic de mayúsculas (¿o controlar-hacer clic? No puedo recordar) para forzar al navegador a invalidar el caché en todos los recursos. Supongo que mi entendimiento es incorrecto – user128602

+0

No estoy seguro de esto tampoco. Creo que los navegadores se comportan de manera diferente en el botón F5/Recargar con/sin Shift. – chris166

0

La secuencia de comandos CGI parece que tiene un parámetro de marca de tiempo ... esto no está cambiando, ¿o sí? El navegador debe tratar cada URL única como un objeto diferente en la memoria caché, por lo que si eso se actualiza con cada solicitud, no coincidirá con la imagen en caché.

Además, el campo Expira no está exactamente en formato RFC 1123, porque necesita dos dígitos para la fecha. Esto puede o no ser un problema, pero es algo que debe verificarse. El navegador incluye Cache-Control: max-age=0, lo que indica que cree que su caché está potencialmente desactualizado.

Una vez que el servidor recibe esta solicitud de validación, puede devolver 304 (Not Modified), o 200 (OK), como lo está haciendo actualmente.

+0

No, la marca de tiempo no está cambiando. Y gracias por la sugerencia en el formato de fecha de caducidad, lo comprobaré dos veces. – user128602

16

El navegador ignora el encabezado Expires si actualiza la página. Siempre comprueba si la entrada de caché sigue siendo válida si se contacta con el servidor web. Idealmente, utilizará el encabezado de solicitud If-Modified-Since para que el servidor pueda devolver '304 Not modified' si la entrada de caché sigue siendo válida.

No está configurando el encabezado Last-Modified, por lo que el navegador tiene que realizar un GET incondicional del contenido para asegurarse de que esté actualizado.

Algunas reglas de oro para el ajuste Expira y la última actualización se describen en esta entrada del blog:

http://blog.httpwatch.com/2007/12/10/two-simple-rules-for-http-caching/

+3

"El navegador ignora el encabezado Caduca si actualiza la página". ¡Gracias! No sabía esto. –

+2

¿Qué navegador hace eso? – Pacerier

0

Cualquier error en su certificado https hará que el navegador para que no respeta sus cabeceras.

Pruébelo sin https y vea si funciona en http plano.

Ver esta respuesta https://stackoverflow.com/a/17716911

Cuestiones relacionadas