Valor máximo para el encabezado de control de caché en HTTP


80

Estoy usando Amazon S3 para entregar activos estáticos para mi sitio web. Quiero que los navegadores guarden en caché estos activos durante el mayor tiempo posible. ¿Qué encabezados de metadatos debo incluir con mis activos?

Cache-Control: max-age=???

el posible valor de edad máxima depende del navegador / versión y de cualquier proxy en el camino ... AFAIK, no hay un estándar / especificación real, por lo que cualquier valor sería una suposición ...
Yahia

Respuestas:


120

Generalmente se aconseja un año como valor máximo estándar. Ver RFC 2616 :

Para marcar una respuesta como "nunca caduca", un servidor de origen envía una fecha de caducidad aproximadamente un año desde el momento en que se envía la respuesta. Los servidores HTTP / 1.1 NO DEBEN enviar fechas de caducidad de más de un año en el futuro.

Aunque eso se aplica al expiresestándar anterior , tiene sentido aplicarlo cache-controltambién en ausencia de una guía de estándares explícita. Es tan largo como generalmente debería necesitar de todos modos y elegir cualquier valor arbitrariamente más largo podría romper algunos agentes de usuario. Entonces:

Cache-Control: max-age=31536000

22

Considere no almacenarlo durante "el mayor tiempo posible" y, en cambio, conformarse con el tiempo que sea razonable. Por ejemplo, es poco probable que necesite almacenarlo en caché durante más de, digamos, 10 años ... ¿verdad?

El RFC analiza la edad máxima aquí: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

Eric Lawrence dice que antes de IE9, Internet Explorer trataría como obsoleto cualquier recurso con un valor de Cache-Control: max-age superior a 2147483648 (2 ^ 31) segundos, aproximadamente 68 años ( http://blogs.msdn.com/b /ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx ).

Otros agentes de usuario, por supuesto, variarán, así que ... intente elegir un número que sea poco probable (¡más que probable!) Que cause un desbordamiento. La edad máxima superior a 31536000 (un año) tiene poco sentido e informalmente se considera un valor máximo razonable.


De hecho, estoy buscando los encabezados específicos para enviar. Tengo un mecanismo integrado en mi sitio web para cambiar la URL del archivo para que apunte a un nombre de archivo diferente si necesito hacer un cambio y que los visitantes lo vean. Solo necesito un ejemplo de los encabezados específicos para enviar para que los navegadores almacenen en caché estos activos de forma indefinida.
Casey Flynn

12
Cache-Control: max-age = 31536000 lo almacenará en caché durante 1 año, que es el máximo recomendado.
EricLaw

2
@Geoffrey: Creo que estás confundido acerca de lo que está construyendo Casey. Simplemente dice que cambiará la URL a la que hace referencia en su marcado cuando cambie la versión. Esta es una de las mejores prácticas utilizadas por la mayoría de los sitios principales.
EricLaw

@Geoffrey ¿Estás seguro de que es "más de 2147483648"? ¿Pensé que era "más de 2147483647"?
Pacerier

4

Las personas que crearon la recomendación de un máximo de 1 año de almacenamiento en caché no lo pensaron bien.

En primer lugar, si un visitante recibe un archivo en caché desactualizado, ¿por qué proporcionaría algún beneficio que cargue repentinamente una versión nueva después de 1 año? Si un archivo tiene TTL de 1 año, desde una perspectiva funcional, obviamente significa que el archivo no está destinado a ser modificado en absoluto.

Entonces, ¿por qué necesitaría uno más de 1 año?

1) ¿Por qué no? No tiene ningún propósito para decirle al navegador de los visitantes "oye, este archivo tiene 1 año, podría ser una idea comprobar si se ha actualizado".

2) Servicios CDN.La mayoría de las redes de entrega de contenido utilizan el encabezado de la caché para decidir cuánto tiempo se entregará un archivo de manera eficiente desde el servidor de borde. Si tiene 1 año de control de caché para los archivos, en algún momento comenzará a volver a solicitar los archivos no modificados del servidor de origen, y la caché de borde deberá volver a completarse por completo, lo que provocará cargas más lentas para el cliente e innecesarias. llamadas al origen.

¿Cuál es el punto de tener como máximo 1 año? ¿Qué navegadores se ahogarán con una cantidad establecida superior a 31536000?


3
1 año es una eternidad en la era de Internet. Además, si se toma en serio el almacenamiento en caché, manejaría (además del control de caché) el mecanismo de última modificación y / o etag. Entonces, incluso esas nuevas solicitudes un año después no dañarán el ancho de banda (304 no modificado)
redben

2
1 año no es una eternidad cuando sus imágenes NUNCA se cambian (como la mayoría de las imágenes en Internet) y cuando no desea que un CDN actualice los archivos desde el origen (lo cual no tendría sentido). En cuanto a la última modificación / etag, por supuesto que inicia una solicitud y un diálogo entre el cliente y el servidor, solo para descubrir lo que ya sabemos "sí, todavía está bien servir el archivo en caché". Su argumento es básicamente "1 año es una eternidad en Internet", lo que no sirve para nada productivo. He establecido un vencimiento de 10 años para las imágenes, lo que simplemente ofrece un mejor resultado final.
suncat100

3
Ah, y también hay un tamaño de caché del navegador predeterminado. ¿Algún activo almacenado en caché sobreviviría un año en la caché de un navegador? No lo sé.
redben

Extremadamente improbable. Algo que demuestra aún más la inutilidad de establecer "1 año" cuando no tiene otro propósito que intentar almacenar en caché un elemento "para siempre" o "el mayor tiempo posible" ...
suncat100

No se trata de que el navegador lo almacene en caché. Se trata de proxies intermedios que lo almacenan en caché, como Akamai y Varnish y el proxy móvil de Google, etc.
Elijah Lynn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.