Hay más de una forma de almacenar en caché.
Obtener condicional
Si está almacenando estas imágenes en el sistema de archivos y sirviéndolas directamente a través del servidor web, probablemente ya esté utilizando get condicional . El servidor web utilizará automáticamente los metadatos del sistema de archivos para establecer un encabezado ETAG y responderá automáticamente con "304 no modificado" si el navegador incluye If-Modified-Since
o If-Matches
encabezados en su solicitud. (Todos los navegadores lo harán).
En este caso, la imagen completa no se devuelve, por lo que tiene ahorros de ancho de banda. Sin embargo, aún se emitirá una solicitud GET, por lo que aún tendrá los gastos generales y la latencia de una solicitud.
Puede disminuir ligeramente el número de solicitudes a expensas de la actualización de la memoria caché haciendo que su servidor web establezca Cache-Control
encabezados con un public,max-age=N
valor para sus imágenes. Esto dice que los cachés pueden conservar el recurso durante la mayoría de los max-age
segundos antes de que tengan que verificar si está actualizado.
Sin embargo, HTTP define solo una forma de invalidar una entrada de caché, que puede no ajustarse a la semántica de su aplicación: si PUBLICA o PONE a una url que actualiza la foto de perfil, responda con un Location: [url of photo]
encabezado y la entrada de caché para esa url se invalidará.
(Este es el mecanismo que le permite almacenar en caché una página web con comentarios, y luego hacer que el navegador vuelva a cargar la página a la fuerza después de que el usuario publique un nuevo comentario. El navegador respondería a POST /comment
con 303 See Other
y a Location: /page/with/comment
. Tenga en cuenta que esto no se utilizó trabajar en Firefox debido a un error de larga data )
A menos que tenga mucho tráfico, este enfoque para el almacenamiento en caché está bien.
Cambio de URL
Una url es una representación de un recurso, por lo que otra forma de administrar el almacenamiento en caché no es cambiar los parámetros de caché para el recurso, sino crear un nuevo recurso con una directiva de "caché para siempre". Este es el enfoque que favorecen los "chicos grandes", porque les permite no generar solicitudes adicionales, lo que les ahorra mucho ancho de banda. La desventaja es que requiere mucha más contabilidad adicional.
Hay dos técnicas generales para esto.
Consultar cadenas
Los servidores web ignoran las cadenas de consulta cuando sirven un archivo desde el sistema de archivos. Sin embargo, los cachés no lo hacen: /1.jpg?t=12345
y /1.jpg?t=67890
son dos recursos completamente diferentes y no relacionados, aunque el servidor piense que son iguales.
Entonces, una cosa fácil que puede hacer es agregar la marca de tiempo del sistema de archivos como una cadena de consulta cada vez que haga una referencia a un recurso en su html y establezca un Expires
encabezado largo . El navegador entonces almacenar en caché este recurso siempre y no hacer ninguna GET, siempre y cuando la cadena de consulta no cambia.
Un inconveniente es que es difícil o imposible instruir al servidor web de la nueva url para un elemento si desea invalidar por la fuerza un caché. Por ejemplo, si un navegador tiene una página HTML en caché con una /1.jpg?v=1
referencia, pero por casualidad borró la entrada /1.jpg?v=1
(tal vez se quedó sin espacio de archivo o memoria), realizará una nueva solicitud /1.jpg?v=1
. Si mientras tanto la imagen ha cambiado a /1.jpg?v=2
, la respuesta adecuada es:
- Servir la versión anterior del archivo. Haría esto si quisiera que todos los recursos sean coherentes entre sí, como lo fueron en un determinado momento. Esto es lo que debe hacer con los archivos CSS, por ejemplo, ya que un nuevo archivo CSS con un viejo archivo HTML puede no funcionar correctamente.
- Redireccionar a la nueva versión del archivo usando
301 Moved Permanently
. Haría esto si quisiera que todos los recursos sean lo más nuevos posible.
Ambos son difíciles de hacer solo con un servidor web, lo que significa que debe invocar una aplicación web incluso para solicitudes de imágenes, que pueden ser más complicadas y requerir más recursos. Los servidores web son muy rápidos para servir archivos, por lo que la sobrecarga de una aplicación web puede terminar tragándose el ancho de banda y las ganancias de latencia.
Nombres de archivo
En lugar de agregar una cadena de consulta, cambia el nombre del archivo. Esto significa que es fácil mantener varias versiones de archivos en el sistema de archivos, pero probablemente necesitará almacenar metadatos de archivos y hacer otra contabilidad de la base de datos para realizar un seguimiento de sus recursos y sus nombres.