2010-12-17 13 views
1

Ich habe eine Webseite mit einer Ressource an einer sich ständig ändernden Adresse. Beispiel: Die Webseite befindet sich möglicherweise unter http://www.mysite.com/?page=page1 und enthält möglicherweise ein Bild http_: //www.mysite.com/?img= image999. Obwohl sich beide Ressourcen auf meiner Website befinden, kontrolliere ich nicht die Platzierung bestimmter Bilder auf bestimmten Seiten.Partielle Zwischenspeicherung von Webressourcen verhindern

Ich setze Header für langes Caching auf Seiten sowie Bilder. Wenn der Benutzeragent jedoch nur Webseiten und keine Bilder zwischenspeichert (oder der Benutzer beispielsweise den Cache löscht und das Bild aus dem Cache gelöscht wird), ruft der Benutzeragent die Seite aus dem Cache ab und fordert /? Img = image999 an. An dieser Stelle befindet sich das Bild jedoch nicht mehr bei /? Image = image999, sondern stattdessen bei /? Image = image998. Somit wird das Bild dem Benutzer nicht angezeigt.

Was ist die Lösung für dieses Problem? Hier sind die, die ich mir vorstellen konnte: -

  1. Deaktivieren Sie das Zwischenspeichern von Webseiten und Bildern. Schlechteste Lösung.
  2. Deaktivieren Sie nur das Zwischenspeichern von Webseiten. Bessere Lösung.
  3. Erinnern Sie sich auf der Serverseite, dass image998 einmal bei image999 war und wenn eine Anfrage für /? Image = image999 eingeht, leiten Sie sie um /? Image = image998. Beste Lösung, aber ein Schmerz zu implementieren. EDIT: In der Tat, ich weiß jetzt, das ist unmöglich in meiner Situation sadface

Mein genaues Problem befaßt sich nicht mit Bildern, sondern mit HTML5-Videos. Insbesondere bei Google Chrome habe ich festgestellt, dass Videos ziemlich häufig aus dem Cache entfernt werden, obwohl ich ein Jahr Verfallsdatum im Cache festlege. Aber ich bin immer noch an der Lösung für allgemeine Ressourcen interessiert, unabhängig von den Caching-Richtlinien von Chrome.

EDIT: Um zu bestätigen, verwende ich "nicht revalidate" + "läuft in 1 Jahr ab" Caching auf der Webseite und das Bild. Wenn also ein UA die Webseite (Seite 1) + Bild (Bild999) einmal anfordert, trifft es den Server für nachfolgende Anfragen nicht und alles ist gut. Das Problem tritt auf, wenn das Bild aus dem UA-Cache herausfällt, die Webseite aber bleibt. In dieser Situation wird der UA nicht den Server für die Webseite anfordern, aber wird anfordern den Server für das Bild (image999). In der Zwischenzeit hat das Bild jedoch URLs geändert (image999 -> image998) und der Server gibt ein 404 zurück. Das Ergebnis ist, dass das UA das Bild nicht anzeigen wird. Wie verhindere ich das?

+0

Die HTML-Seite, die den Link zu img999 enthält, sollte sich ändern, und der Browser sollte eine neue Seite anfordern, anstatt die zwischengespeicherte Version zu verwenden, da kein HTTP-Header mit NOT-MODIFIED erhalten wird. Ich verstehe das Problem nicht. Am Ende der Frage sagen Sie, dass das Problem ist, dass es nicht zwischengespeichert wird, was nicht das ist, was Sie am Anfang der Frage (mit einem Link zu einer veralteten Ressource) gesagt haben –

+0

Sorry für die Verwirrung. Es ist die Webseite, die zwischengespeichert wird, aber nicht das Bild. Ich muss beide im Cache sein. – Arnavion

+0

Der Grund, warum ich nicht möchte, dass die Webseite erneut heruntergeladen wird, wenn sich die Bild-URL ändert, ist, dass das Bild immer noch dasselbe ist, nur unter einer anderen URL. Wie gesagt, das eigentliche Problem ist nicht mit Bildern, sondern mit HTML5-Videos, und die URL, die sich ständig ändert, ist eine Verhinderungsmassnahme für die Hot-Linking-Funktion. Aber wenn ein Kunde die Webseite + Video bereits angefordert hat, ist es mir egal, ob sie ihn für alle Ewigkeit zwischenspeichern. – Arnavion

Antwort

0

Wie in der Frage erwähnt, das sind die Lösungen, die ich mir vorstellen kann, wenn ich beschränke mich die Expires-Header zu verwenden: -

  1. Disable Caching für beide Web-Seiten und Bilder.

  2. Aktivieren Sie nur das Zwischenspeichern von Bildern. Jede Anfrage für die Webseite wird vom Server bearbeitet, aber Anfragen für zwischengespeicherte Bilder treffen den Server nicht.

  3. Aktivieren Sie das Zwischenspeichern für Webseiten und Bilder. Für Anfragen zu veralteten Bildern, senden Sie eine "301 Moved Permanently" -Antwort mit der Position des neuen Bildes und beten Sie, dass die UA es zwischenspeichert. (Meine Tests zeigen, dass Google Chrome nicht 301 Anfragen oder den Inhalt zwischenspeichert es unabhängig von dem Cache-Header umgeleitet wird)

Für mein Problem habe ich über die Verwendung der Expires-Header aufgegeben und ist stattdessen mit ETag für beide Webseiten und Bilder.Auf diese Weise muss ich keine Anfragen nach veralteten Bildern bearbeiten.

Verwandte Themen