2010-06-11 11 views
6

Sto cercando di capire se riesco a far sì che i browser memorizzino nella cache le immagini con URL firmati.Memorizzazione nella cache di immagini con stringhe di query diverse (URL con firma S3)

Quello che voglio è generare un nuovo URL firmato per ogni richiesta (stessa immagine, ma con una firma aggiornata), ma fare in modo che il browser non lo scarichi nuovamente ogni volta.

Quindi, supponendo che le intestazioni relative alla cache siano impostate correttamente e che l'URL sia lo stesso eccetto per la stringa di query, esiste un modo per rendere il browser in cache?

gli URL sarebbe un aspetto simile:

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 

Abbiamo in programma di impostare le e-tag di essere un md5sum, così sarà almeno figura fuori è la stessa immagine a quel punto?

La mia altra opzione è quella di tenere traccia di quando l'ultimo ha dato un URL, quindi iniziare a distribuirne di nuovi leggermente prima che scadano i vecchi, ma preferirei non occuparmi delle informazioni sulla sessione.

risposta

4

Il browser utilizzerà l'intero URL per scopi di memorizzazione nella cache, inclusi i parametri di richiesta. Quindi se cambi un parametro di richiesta sarà effettivamente una nuova "chiave" nella cache e scaricherà sempre una nuova copia di quell'immagine. Questa è una tecnica popolare nel mondo della pubblicazione di annunci: aggiungi un numero casuale (o il timestamp corrente) alla fine dell'URL come parametro per garantire che il browser torni sempre sul server per fare una nuova richiesta.

L'unico modo per farlo funzionare è se è possibile rendere statico l'URL, ovvero utilizzando le regole di riscrittura di Apache o un proxy di qualche tipo.

+0

Sapete se controllerà almeno l'e-tag e non lo scaricherà nuovamente? –

+0

L'intestazione ETag viene inviata dal browser al server solo quando trova il file nella sua cache (e se il file originale aveva un valore ETag). Quindi, se non riesce a trovarlo nella sua cache (che non lo farà se l'URL è cambiato), non c'è alcun valore ETag da inviare nella richiesta. –

+1

La regola di riscrittura degli URL renderebbe quindi inutilizzabile la firma S3, poiché il server Web fornirà automaticamente un collegamento non scaduto. Quindi potresti anche contrassegnare i file in S3 come "pubblici". (Quindi, non è richiesta alcuna firma per accedere ai file) – Tarnschaf

3

Ho riscontrato esattamente lo stesso problema con gli URL firmati S3. L'unica soluzione che ho trovato è che gli URL scadano lo stesso giorno. Questo non è l'ideale, ma almeno fornirà il caching per un po 'di tempo.

Ad esempio, tutti gli URL firmati nel mese di aprile impostano la scadenza il 10 maggio. Tutti gli URL firmati a giugno sono impostati per scadere il 10 luglio. Ciò significa che gli URL firmati saranno identici per tutto il mese.

1

Appena inciampato su questo problema e trovato un modo per risolverlo. Ecco cosa devi fare:

  1. Memorizza prima stringa di URL (in localStorage per esempio);
  2. Quando si riceve img url prossima volta basta controllare se i loro URL principale match (str1.split('?')[0] === str2.split('?')[0])
  3. Se lo fanno, utilizzare il primo come img src attributo.

Spero che aiuti qualcuno.

Problemi correlati