2009-03-13 22 views
81

Estoy tratando de hacer algo que pensé que sería bastante simple. Obtenga IIS 7 para decirle a los clientes que pueden almacenar en caché todas las imágenes de mi sitio durante un tiempo determinado, digamos 24 horas.IIS7 Cache-Control

He intentado el paso en http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx pero fue en vano. Todavía recibo solicitudes para el servidor con 304s devueltos.

¿Alguien tiene una manera de hacer esto? Tengo un sitio gráficamente intensivo y mis usuarios están siendo martillados (al igual que mi servidor) cada vez que solicitan una página. Curiosamente, las imágenes parecen tener "Cache-Control private, max-age = 3600" apareciendo en Firebug pero el navegador todavía las está solicitando cuando presiono F5.

Respuesta

100

Si desea establecer el encabezado Cache-Control, no hay nada en la IU de IIS7 para hacer esto, lamentablemente.

Sin embargo, puede caer esta web.config en la raíz de la carpeta o el sitio donde se desea establecer que:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
    <staticContent> 
     <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" /> 
    </staticContent> 
    </system.webServer> 
</configuration> 

que informará al cliente a contenido de la caché durante 7 días en esa carpeta y todas subcarpetas.

También puede hacer esto mediante la edición de la metabase de IIS 7 a través de appcmd.exe, así:

 
\Windows\system32\inetsrv\appcmd.exe 
    set config "Default Web Site/folder" 
    -section:system.webServer/staticContent 
    -clientCache.cacheControlMode:UseMaxAge 

\Windows\system32\inetsrv\appcmd.exe 
    set config "Default Web Site/folder" 
    -section:system.webServer/staticContent 
    -clientCache.cacheControlMaxAge:"7.00:00:00" 
+5

La documentación de MSDN para el elemento de configuración staticContent se puede encontrar aquí: http://msdn.microsoft.com/en-us/library/ms689443.aspx –

+4

Consulte las publicaciones de 360Airwalk a continuación, hay una IU para esto en IIS7 – ChadT

+0

Solo como información : esta configuración parece no tener ningún efecto en el servidor de desarrollo integrado (al menos de VS 2010 SP1). Si tiene dudas sobre por qué no funciona, consulte con IIS. –

19

El F5 Refresh tiene la semántica de "por favor vuelva a cargar el código HTML Y sus dependencias directas". Por lo tanto, debe esperar ver cualquier recurso imgs, css y js referenciado directamente por el HTML que también se vuelve a analizar. Por supuesto, un 304 es una respuesta aceptable a esto, pero la actualización de F5 implica que el navegador realizará la solicitud en lugar de confiar en el contenido del caché nuevo.

En su lugar, intente simplemente navegar en otro lugar y luego navegando hacia atrás.

Puede forzar la actualización, más allá de un 304, manteniendo presionado ctrl mientras presiona f5 en la mayoría de los buscadores.

+2

¿Quiere decir Ctrl + F5 derecho! – Anicho

106

eso no es verdad Jeff.

Simplemente tiene que seleccionar una carpeta dentro de la interfaz de usuario del Administrador de IIS 7 (por ejemplo, Imágenes o evento la carpeta Aplicación web predeterminada) y luego hacer clic en "Encabezados de respuesta HTTP". Luego tiene que hacer clic en "Establecer encabezado común ..." en el panel derecho y seleccionar "Caducar contenido web". Allí puede configurar fácilmente un máximo de 24 horas seleccionando "Después de", ingresando "24" en el cuadro de texto y seleccionando "Horas" en el cuadro combinado.

Su primer párrafo con respecto a la entrada web.config es correcto. Agregaría el atributo cacheControlCustom para establecer el encabezado de control de caché en "público" o lo que sea necesario en ese caso.

Puede, por supuesto, lograr lo mismo al proporcionar entradas (o archivos) web.config según sea necesario.

Editar: extrae una frase confusa :)

+1

La interfaz de usuario para esta configuración es terrible. ¡Pero gracias por explicar cómo llegar! +1 –

+0

Esta interfaz crea un web.config con la misma configuración que Jeff publicó. ¡Bueno saber! ¡Gracias! – RandyMorris

+2

Gracias por la publicación @ 360Airwalk. ¿Sabe cómo servir diferentes encabezados 'Cache-Control' (' max-age') para diferentes mime-types o extensiones de archivos? – Jasper

21

utilizo este

<staticContent> 
<clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="500.00:00:00" /> 
</staticContent> 

para almacenar en caché el contenido estático durante 500 días con el jefe de control de caché pública.

+9

La práctica recomendada es de 1 año, esencialmente, 365 días no más. – Anicho

+5

500 días es malo, que los artículos habla de una norma RFC diciendo que no establezca el caché a más de 1 año https://developers.google.com/speed/docs/best-practices/caching No establezca a más de un año en el futuro, ya que eso viola las pautas de RFC. – foxontherock

16

Complementando la respuesta de Elmer, ya que mi edición se ha retrotraído.

para almacenar en caché el contenido estático durante 365 días con cabecera de control de caché pública, IIS se puede configurar con el siguiente

<staticContent> 
    <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" /> 
</staticContent> 

Esto se traducirá en una cabecera de la siguiente manera:

Cache-Control: public,max-age=31536000 

Tenga en cuenta que max-age es un delta en segundos, que se expresa en un entero positivo de 32 bits como se indica en RFC 2616 Sections 14.9.3 and 14.9.4. Esto representa un valor máximo de 2^31 o 2,147,483,648 segundos (más de 68 años). Sin embargo, para garantizar mejor la compatibilidad entre clientes y servidores, adoptamos un máximo recomendado de 365 días (un año).

Como se menciona en otras respuestas, puede utilizar estas directivas también en el sitio web.config de su sitio para todo el contenido estático. Como alternativa, se puede usar sólo para contenidos en una ubicación específica también (en la muestra, 30 días caché pública para los contenidos en la carpeta "CDN"):

<location path="cdn"> 
    <system.webServer> 
     <staticContent> 
      <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/> 
     </staticContent> 
    </system.webServer> 
</location> 
+0

Luciano, Estoy tratando de almacenar en caché mis imágenes usando su método. Ahora, cuando analizo usando HttpFox, veo 2 solicitudes hechas para cada imagen. 1. El primero arroja un resultado abortado con el error (NS_BINDING_ABORTED) 2. segunda solicitud es una imagen en caché. ¿Alguna idea? – Mithil

-1

hay una manera fácil: 1. utilizando web.config de página web 2. en la sección "StaticContent" eliminar FileExtension específica y añadir MimeMap 3. complemento "clientCache"

<configuration> 
    <system.webServer> 
    <urlCompression doStaticCompression="true" doDynamicCompression="true" /> 
    <staticContent> 
     <remove fileExtension=".ipa" /> 
     <remove fileExtension=".apk" /> 
     <mimeMap fileExtension=".ipa" mimeType="application/iphone" /> 
     <mimeMap fileExtension=".apk" mimeType="application/vnd.android.package-archive" /> 
     <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="777.00:00:00" /> 
    </staticContent> 
    </system.webServer> 
</configuration>