Control de caché IIS7

95

Estoy tratando de hacer algo que pensé que sería bastante simple. Consiga que IIS 7 les diga a los clientes que pueden almacenar en caché todas las imágenes de mi sitio durante un tiempo determinado, digamos 24 horas.

Probé 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 que van al servidor y se devuelven 304.

¿Alguien tiene una forma de hacer esto? Tengo un sitio gráficamente intensivo y mis usuarios están siendo golpeados (también 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 solicita cuando presiono F5.

Chris Meek
fuente

Respuestas:

124

Si desea configurar el encabezado Cache-Control, no hay nada en la IIS7 UI para hacer esto, lamentablemente.

Sin embargo, puede colocar este web.config en la raíz de la carpeta o sitio donde desea configurarlo:

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

Eso informará al cliente que almacene en caché el contenido durante 7 días en esa carpeta y todas las subcarpetas.

También puede hacer esto editando la metabase de IIS7 a través de appcmd.exe, así:

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  set config "Sitio web / carpeta predeterminados" 
  -sección: system.webServer / staticContent 
  -clientCache.cacheControlMode: UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  set config "Sitio web / carpeta predeterminados" 
  -sección: system.webServer / staticContent 
  -clientCache.cacheControlMaxAge: "7.00: 00: 00"
Jeff Atwood
fuente
5
La documentación de MSDN para el elemento de configuración staticContent se puede encontrar aquí: msdn.microsoft.com/en-us/library/ms689443.aspx
Milan Gardian
4
Vea las publicaciones de 360Airwalk a continuación, hay una interfaz de usuario para esto en IIS7
ChadT
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 de por qué no funciona, consulte con IIS.
6
Hola, Jeff, ¿sabes cómo servir diferentes encabezados Cache-Control( max-age) para diferentes tipos de mime o extensiones de archivos?
Jasper
@Jeff Atwood Tal vez puedas ayudarme. Mire esto: stackoverflow.com/questions/57990579/…
Success Man
115

Eso no es cierto Jeff.

Simplemente tiene que seleccionar una carpeta dentro de la interfaz de usuario de IIS 7 Manager (por ejemplo, Imágenes o evento, la carpeta de la aplicación web predeterminada) y luego hacer clic en "Encabezados de respuesta HTTP". Luego tienes que hacer clic en "Establecer encabezado común ..." en el panel derecho y seleccionar "Expire Web content". Allí puede configurar fácilmente una edad máxima de 24 horas seleccionando "Después:", 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.

Por supuesto, puede lograr lo mismo proporcionando entradas (o archivos) web.config según sea necesario.

Editar: eliminó una oración confusa :)

360 Paseo aéreo
fuente
1
La interfaz de usuario de esta configuración es terrible. ¡Pero gracias por explicarnos cómo llegar! +1
Billy Coover
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 tipos de mime o extensiones de archivos?
Jasper
3
@Jaspe: puede configurarlo por carpeta, por ejemplo. si configura el control de caché en una carpeta, las subcarpetas heredarán la configuración, pero puede anularla nuevamente y así sucesivamente. incluso puede hacerlo por archivo. si no puede acceder a la consola iis, también puede hacerlo a través de web.config. vea esta publicación para ver el último stackoverflow.com/questions/2195266/…
360Airwalk
27

yo uso esto

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

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

Elmer
fuente
10
La práctica recomendada es 1 año esencialmente 365 días no más.
Anicho
5
500 días es MALO, ese artículo habla de una regla de RFC que dice que no configure la caché en más de 1 año. Developers.google.com/speed/docs/best-practices/caching No la configure en más de un año en el futuro. , ya que viola las pautas de RFC.
foxontherock
@foxontherock, ¿de alguna manera podrías corroborar que la regla RFC de más de 365 días es una mala práctica? No puedo encontrar nada que sugiera esto en la documentación ...
Paesano2000
@Elmer Tal vez puedas ayudarme. Mire esto: stackoverflow.com/questions/57990579/…
Success Man
19

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

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

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

AnthonyWJones
fuente
18

Complementando la respuesta de Elmer, ya que mi edición fue revertida.

Para almacenar en caché el contenido estático durante 365 días con el encabezado de control de caché público , IIS se puede configurar con lo siguiente

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

Esto se traducirá en un encabezado como este:

Cache-Control: public,max-age=31536000

Tenga en cuenta que max-age es un delta en segundos, expresado por un entero positivo de 32 bits como se indica en las secciones 14.9.3 y 14.9.4 de RFC 2616 . 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 mencionó en otras respuestas, puede usar estas directivas también en web.config de su sitio para todo el contenido estático. Como alternativa, puede usarlo solo para contenidos en una ubicación específica (en el ejemplo, caché pública de 30 días para el contenido de la carpeta "cdn"):

<location path="cdn">
   <system.webServer>
        <staticContent>
             <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
   </system.webServer>
</location>
Luciano Carvalho
fuente
Luciano, estoy tratando de almacenar en caché mis imágenes usando tu método. Ahora, cuando analizo el uso de HttpFox, veo 2 solicitudes realizadas para cada imagen. 1. El primero da un resultado abortado con el error (NS_BINDING_ABORTED) 2. La segunda solicitud es una imagen en caché. ¿Alguna idea?
Mithil
1

hay una manera fácil: 1. usando web.config del sitio web 2. en la sección "staticContent" elimine la extensión de archivo específica y agregue mimeMap 3. agregue "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>
usuario1401317
fuente