2010-06-11 5 views
6

Ich versuche herauszufinden, ob ich Browser dazu bringen kann, Bilder mit signierten URLs zwischenzuspeichern.Zwischenspeichern von Bildern mit verschiedenen Abfragezeichenfolgen (S3 signierte URLs)

Ich möchte eine neue signierte URL für jede Anfrage (dasselbe Bild, aber mit einer aktualisierten Signatur) generieren, aber der Browser nicht jedes Mal erneut herunterladen.

Angenommen, die cache-bezogenen Header sind korrekt eingestellt und die URL ist die gleiche wie die Abfragezeichenfolge. Gibt es eine Möglichkeit, den Browser zwischenzuspeichern?

Die Urls würde in etwa so aussehen:

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 

Wir planen, die E-Tags setzen eine MD5-Summe zu sein, so wird es zumindest herausfinden es das gleiche Bild ist an diesem Punkt?

Meine andere Möglichkeit besteht darin, den Überblick zu behalten, wann die letzte URL ausgegeben wurde, und dann neue auszugeben, bevor die alten ablaufen, aber ich würde mich lieber nicht mit den Sitzungsinformationen beschäftigen.

Antwort

4

Der Browser verwendet die gesamte URL für Caching-Zwecke, einschließlich Anfrage-Parameter. Wenn Sie also einen Request-Parameter ändern, wird er effektiv ein neuer "Schlüssel" im Cache und lädt immer eine neue Kopie dieses Images herunter. Dies ist eine beliebte Technik in der Adserving-Welt - Sie fügen am Ende der URL eine Zufallszahl (oder den aktuellen Zeitstempel) als Parameter hinzu, um sicherzustellen, dass der Browser immer zum Server zurückkehrt, um eine neue Anfrage zu stellen.

Der einzige Weg, wie Sie das zum Laufen bringen können, ist, wenn Sie die URL statisch machen können - d. H. Indem Sie Apache Rewrite-Regeln oder einen Proxy irgendeiner Art verwenden.

+0

Wissen Sie, ob es das e-tag überprüft und nicht noch einmal herunterlädt? –

+0

Der ETag-Header wird nur vom Browser an den Server gesendet, wenn er die Datei im Cache findet (und wenn die ursprüngliche Datei einen ETag-Wert hatte). Wenn es also nicht in seinem Cache gefunden werden kann (was nicht der Fall ist, wenn sich die URL geändert hat), gibt es keinen ETag-Wert, der in der Anfrage gesendet werden kann. –

+1

Die URL-Rewrite-Regel würde die S3-Signatur dann wieder unbrauchbar machen, da der Webserver automatisch eine nicht abgelaufene Verbindung bereitstellen würde. Dann könnten Sie Dateien in S3 auch als "public" markieren. (Dann ist keine Signatur erforderlich, um auf die Dateien zuzugreifen) – Tarnschaf

3

Ich habe genau das gleiche Problem mit S3 signierten URLs. Die einzige Lösung, die ich gefunden habe, ist, dass die URLs am selben Tag ablaufen. Dies ist nicht ideal, aber zumindest wird es Caching für einige Zeit bieten.

Zum Beispiel alle URLs, die im April signiert wurden, habe ich am 10. Mai eingestellt. Alle URLs, die ich im Juni signiert habe, sind am 10. Juli abgelaufen. Dies bedeutet, dass die signierten URLs für den gesamten Monat identisch sind.

1

Gerade stolperte über dieses Problem und fand einen Weg, es zu lösen. Hier ist, was Sie tun müssen:

  1. Speichern erste URL-Zeichenfolge (in localStorage zum Beispiel);
  2. Wenn Sie img url beim nächsten Mal nur erhalten überprüfen, ob ihre Haupt Urls Spiel (str1.split('?')[0] === str2.split('?')[0])
  3. Wenn sie es tun, die ersten als img src Attribut verwenden.

Ich hoffe, es hilft jemandem.