2010-06-07 22 views
11

No estoy seguro de si esto es un problema del servidor, o si no estoy logrando entender cómo funciona realmente el caché de HTTP.Confusión de caché de HTTP

Tengo una aplicación ASP MVC ejecutándose en IIS7. Hay mucho contenido estático como parte del sitio, incluidos muchos CSS, Javascript y archivos de imágenes.

Para estos archivos, quiero que el navegador los guarde en caché durante al menos un día; nuestros archivos .css, .js, .gif y .png rara vez cambian.

Mi web.config es el siguiente:

<system.webServer> 
    <staticContent> 
     <clientCache cacheControlMode="UseMaxAge" 
        cacheControlMaxAge="1.00:00:00" /> 
    </staticContent> 
</system.webServer> 

El problema que estoy recibiendo es que no parece que el navegador (probado Chrome, IE8 y FX) para ser el almacenamiento en caché los archivos como lo había esperar. Tengo la configuración predeterminada (compruebe las páginas más nuevas automáticamente en IE).

En la primera visita de los descargas de contenido como se esperaba

HTTP/1.1 200 OK 
Cache-Control: max-age=86400 
Content-Type: image/gif 
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT 
Accept-Ranges: bytes 
ETag: "3efeb2294517ca1:0" 
Server: Microsoft-IIS/7.0 
X-Powered-By: ASP.NET 
Date: Mon, 07 Jun 2010 14:29:16 GMT 
Content-Length: 918 

<content> 

creo que la Cache-Control: max-age=86400 debería decirle al navegador que no solicitar la página de nuevo por un día.

Ok, ahora la página se vuelve a cargar y el navegador solicita la imagen nuevamente. Esta vez se obtiene una respuesta vacía con estos encabezados:

HTTP/1.1 304 Not Modified 
Cache-Control: max-age=86400 
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT 
Accept-Ranges: bytes 
ETag: "3efeb2294517ca1:0" 
Server: Microsoft-IIS/7.0 
X-Powered-By: ASP.NET 
Date: Mon, 07 Jun 2010 14:30:32 GMT 

Así que parece que el navegador ha enviado el ETag espalda (como un identificador único para el recurso), y del servidor volver con una 304 Not Modified - indicando al navegador que puede usar el archivo previamente descargado.

Me parece que sería correcto para muchas situaciones de almacenamiento en caché, pero aquí no quiero el viaje redondo adicional. No me importa si la imagen se desactualiza cuando cambia el archivo en el servidor.

Hay muchos de estos archivos (incluso con sprites-maps y similares) y muchos de nuestros clientes tienen redes muy lentas. Cada viaje de ida y vuelta para hacer ping para ese estado está tomando entre 10 y 5 segundos. Muchos también tienen IE6 que solo tiene 2 conexiones HTTP a la vez. El resultado neto es que nuestra aplicación parece ser muy lenta para estos clientes, con cada página tardando un par de segundos más para verificar que el contenido estático no haya cambiado.

¿Qué encabezado de respuesta me falta que podría causar que el navegador guarde en caché agresivamente los archivos?

¿Cómo configuro esto en .Net web.config para IIS7?

¿Entiendo mal cómo funciona el almacenamiento en caché de HTTP en primer lugar?

+0

¿Se puede desactivar ETag? Eso podría arreglarlo, pero no estoy seguro. –

+0

Voy a intentar eliminar el ETag, pero para mi servidor de prueba parece coincidir con – Keith

+6

Si presiona actualizar o F5, el navegador siempre hará una solicitud del servidor (posiblemente una solicitud condicional) independientemente de la configuración del caché –

Respuesta

5

uso expira el encabezado en lugar de usar el control de caché. Dígale a su servidor por primera vez que me sirva contenido desde el caché de mi navegador hasta esta fecha de caducidad. No habrá verificación cruzada de los cambios en el archivo hasta su fecha de vencimiento.

agregar el encabezado de la sección system.webServer de su web.config de este modo:

<system.webServer> 
    <staticContent> 
     <clientCache httpExpires="Sun, 29 Mar 2020 00:00:00 GMT" 
        cacheControlMode="UseExpires" />; 
    </staticContent> 
</system.webServer> 
+0

¿Cómo lo haría en IIS7? Además, ¿por qué funciona cuando 'cache-control' no funciona? – Keith

+0

Gracias por la aclaración, ¿está roto el 'cache-control'? – Keith

+0

no, creo que hay algo que usted y yo nos falta. Estoy leyendo más sobre el control de caché, en este punto, le dejaré saber si lo veo claro. Sí, pero mi sugerencia funcionó para usted –

6

Es necesario utilizar el Expira Directiva, de lo contrario el navegador siempre comprobar para ver si el contenido ha actualizado.

Si una entrada en caché tiene una fecha de caducidad válida, el navegador puede reutilizar el contenido sin tener que contactar al servidor en absoluto cuando se vuelve a visitar una página o sitio. Esto reduce en gran medida el número de viajes redondos de red para páginas visitadas con frecuencia. Por ejemplo, el logotipo de Google expirará en 2038 y solo se descargará en su primera visita a google.com o si ha vaciado el caché de su navegador. Si alguna vez quieren cambiar la imagen, pueden usar una ruta o nombre de archivo de imagen diferente.

Para cambiar en IIS7 use a continuación. Esto es más fácil de administrar si mantiene el contenido estático en directorios específicos.

entrar en el servidor
Abra el Administrador de IIS (Inicio -> Herramientas administrativas -> Administrador de IIS
Expandir el nodo de servidor
expanda el nodo Sitios
Abrir el sitio y vaya al directorio que desea cambiar
Abra la sección IIS encabezados de respuesta HTTP
Haga clic en Configurar encabezados comunes en el panel de tareas de la derecha
Set "vencido el contenido web" como su aplicación requiere.

+1

Gracias - sus pasos en IIS7 en realidad producirán el mismo XML web.config que está en mi pregunta. – Keith

-1

Abreviatura breve: elimine Etag y use el encabezado Expire.

Debe retirar la 35 Yahoo Performance best practices, y más concretamente:

Para cada regla, por lo general cubren Configuraciones del servidor web Apache e IIS.

EDIT: Bueno, parece que no hay manera fácil de quitar Etags en IIS, besides installing some 3rd party software ...

+0

Desafortunadamente, no parece posible eliminar los ETags en IIS7; consulte http://stackoverflow.com/questions/477913 – Keith

+0

¿Por qué el encabezado 'expire' funcionaría cuando' cache-control' no funciona? No tenemos que admitir IE5 y todo lo anterior admite HTTP 1.1 – Keith

+0

Gracias por la respuesta (+1).'Expires' y' Cache-Control' funcionan igual de bien (a menos que estés en IE5 o inferior, luego solo 'Expires') siempre que cualquiera de los dos esté en buen estado. Resulta que mi problema real era que estaba presionando F5/refresh para verificar, y eso siempre hace que el navegador haga ping para cada archivo y obtenga las respuestas _304 Not Modified_. – Keith