2010-06-11 6 views
6

Estoy tratando de averiguar si puedo obtener navegadores para almacenar en caché las imágenes con direcciones URL firmadas.Almacenamiento en caché de imágenes con cadenas de consulta diferentes (URL firmadas S3)

Lo que quiero es generar una nueva url firmada para cada solicitud (misma imagen, pero con una firma actualizada), pero que el navegador no vuelva a descargarla cada vez.

Entonces, suponiendo que los encabezados relacionados con el caché estén configurados correctamente, y que toda la URL sea la misma excepto la cadena de consulta, ¿hay alguna forma de hacer que el navegador lo guarde en caché?

las direcciones URL se vería algo como:

http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297463 
http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297500 

Tenemos la intención de establecer la dirección de etiquetas a ser una suma md5, también lo hará por lo menos averiguar que es la misma imagen en ese punto?

Mi otra opción es hacer un seguimiento de la última vez que se dio una url, y luego comenzar a entregar nuevas poco antes de que expiren las anteriores, pero preferiría no tratar con la información de la sesión.

Respuesta

4

El navegador utilizará la URL completa para el almacenamiento en caché, incluidos los parámetros de solicitud. Entonces, si cambia un parámetro de solicitud, será efectivamente una nueva "clave" en la memoria caché y siempre descargará una nueva copia de esa imagen. Esta es una técnica popular en el mundo de publicación de anuncios: agrega un número aleatorio (o la marca de tiempo actual) al final de la URL como parámetro para garantizar que el navegador siempre regrese al servidor para realizar una nueva solicitud.

La única forma en que puede hacer que esto funcione es si puede hacer que la URL sea estática, es decir, utilizando reglas de reescritura de Apache o un proxy de algún tipo.

+0

¿Sabes si al menos comprobará la etiqueta electrónica y no volverá a descargarla? –

+0

El encabezado ETag solo es enviado por el navegador al servidor cuando encuentra el archivo en su caché (y si el archivo original tenía un valor ETag). Entonces, si no puede encontrarlo en su caché (lo cual no ocurrirá si la URL ha cambiado), no hay un valor de ETag para enviar en la solicitud. –

+1

La regla de reescritura de URL volvería a inutilizar la firma S3, ya que el servidor web proporcionaría automáticamente un enlace no caducado. Luego, también puede marcar los archivos en S3 como "públicos". (Entonces, no se requiere firma para acceder a los archivos) – Tarnschaf

3

He tenido exactamente el mismo problema con las URL firmadas con S3. La única solución que se me ocurrió es que las URL caduquen el mismo día. Esto no es ideal, pero al menos proporcionará almacenamiento en caché por un tiempo.

Por ejemplo, todas las URL firmadas durante el mes de abril establezco el vencimiento el 10 de mayo. Todas las URL firmadas en junio expiraré el 10 de julio. Esto significa que las URL firmadas serán idénticas para todo el mes.

1

Acabo de tropezar con este problema y encontré la manera de resolverlo. Esto es lo que necesita hacer:

  1. Almacene la primera cadena de url (en localStorage por ejemplo);
  2. Cuando recibe img url próxima vez sólo comprobar si su principal partido de direcciones URL (str1.split('?')[0] === str2.split('?')[0])
  3. Si lo hacen, utilice el primero como img src atributo.

Espero que ayude a alguien.

Cuestiones relacionadas