Alex: Der Cache des IE

Hallo Leute,

heute ist mir etwas sehr seltsames unter die Augen gekommen. Ein Kunde hat sich gemeldet und gesagt, dass einige Funktionen unseres Online-Tools nicht funktionieren.

Habe mir darüber sehr gewundert, weil ich das Ganze eigentlich sehr ausführlich getestet habe. Der eine Fehler hat sich anscheinend auch auf einen Teil mit TinyMCE bezogen. Habe deshalb im IE 8 nochmal alles getestet - kein Problem.

Dann habe ich mir einen Screenshot von der Seite schicken lassen - und siehe da ich sehe die alte Version und die neue Version der Seite gemischt. Anscheinend hat ein paar upgedatete Sachen nicht nachgeladen und deshalb klappt es nicht.

header('Cache-Control: must-revalidate, pre-check=0, no-store, no-cache, max-age=0, post-check=0');
oben auf jeder Seite hat auch nicht geholfen. Der Kunde musste das auf den Betroffenen seiten mit "F5" lösen.

Kann ich das irgendwie mit anderen header-Informationen beeinflussen? Bei mir am IE 8 hat alles normal funktioniert...
Für Bilder die per AJAX geändert werden können verwende ich schon Dateinamen im Format bild.jpg?.time() für die "normalen" Sachen würde ich das aber nicht unbedingt machen wollen...

Vielleicht wieß von euch ja jemand Rat - danke schon mal!

Gruß
Alex

  1. ich sehe die alte Version und die neue Version der Seite gemischt. Anscheinend hat ein paar upgedatete Sachen nicht nachgeladen und deshalb klappt es nicht.

    header('Cache-Control: must-revalidate, pre-check=0, no-store, no-cache, max-age=0, post-check=0');
    oben auf jeder Seite hat auch nicht geholfen.

    Das kann nicht helfen. Wenn der Browser der Meinung ist, die alten Sachen, die er im Cache hat, wären noch gültig, macht er sich in der Regel nicht die Mühe, diese nochmals anzufragen und kann dementsprechend auch nicht mitbekommen, dass er die neue Version nicht zwischenspeichern soll (zumal es sinnlos ist, die neuen gar nicht zwischenzuspeichern – die funktionieren schließlich, es geht um die alten Versionen).
    Beachte darüber hinaus, dass so eine Angabe nur für das jeweilige Objekt gilt. Schickst du sie zum Beispiel mit dem HTML-Code, gilt sie auch nur für diesen, _nicht_ für vom HTML-Code referenzierte Bilder oder Javascript-Dateien, die haben ihre eigenen Attribute.

    Nimm' die Zeile wieder raus, es verschlimmbessert die gesamte Anwendung nur, weil du jetzt alle zwingst, immer wieder neu zu laden, obwohl es offenbar beim überwiegenden Teil problemlos funktionierte.

    Kann ich das irgendwie mit anderen header-Informationen beeinflussen?

    Nein, nachträglich nicht, siehe oben. Du kannst es im Voraus beeinflussen, indem du ein sinnvolles Verfallsdatum ausgibst. Sinnvoll! "Sofort" ist in den seltensten Fällen sinnvoll, sondern nur gedankenlos. TinyMCE beispielsweise änderst du wohl kaum jede Sekunde, sondern nur alle paar Wochen. Ein Verfallsdatum von einem Tag wäre hier mehr als angemessen, eher noch länger.

    Es sei aber angemerkt, dass das Browser-Standardverhalten vorsieht, bei _jedem_ Zugriff auf ein Objekt dieses beim Server anzufragen, auch, wenn das Objekt bereits im Browser-Cache liegt (in dem Fall wird nur ein Abgleich durchgeführt, keine Datenübermittlung)! Genau deshalb wird es bei dir und so ziemlich allen anderen auch einwandfrei funktionieren.

    Nun gibt es in Browsern die Möglichkeit, das Caching-Verhalten manuell zu ändern. Deshalb solltest du den Kunden bitten, seine Browser-Einstellungen diesbezüglich zu überprüfen (IE-Menü Extras -> Internetoptionen -> Seite Allgemein -> Temporäre Dateien -> Einstellungen). Die Option "Automatisch auf aktuelle Versionen prüfen" müsste IMHO richtig sein, "bei jedem Start" wäre auch noch ok, "niemals" ist aber definitiv falsch, "immer" überaus unklug.

    Weiterhin solltest du prüfen, welche Kopfdaten dein Server sendet. Mit LiveHTTPHeaders, Firebug (beide Firefox) oder Dragonfly (Opera) kannst du den HTTP-Verkehr mitschneiden.

    Für Bilder die per AJAX geändert werden können verwende ich schon Dateinamen im Format bild.jpg?.time()

    Das halte ich für eine Holzhammermethode, das Caching bzw. die Methoden zu Kontrolle desselben sind eigentlich im Grunde ausgereift.

    Ein kurzes Verfallsdatum mittels Expires sollte vollkommen ausreichen. Falls es sich um statische Dateien handelt und du einen aktuellen Apache verwendest, befasse dich mit mod_expires.

    1. Nachtrag, das war vielleicht etwas missverständlich geschrieben:

      Dieses …

      Wenn der Browser der Meinung ist, die alten Sachen, die er im Cache hat, wären noch gültig, macht er sich in der Regel nicht die Mühe, diese nochmals anzufragen

      … und dieses …

      Es sei aber angemerkt, dass das Browser-Standardverhalten vorsieht, bei _jedem_ Zugriff auf ein Objekt dieses beim Server anzufragen, auch, wenn das Objekt bereits im Browser-Cache liegt (in dem Fall wird nur ein Abgleich durchgeführt, keine Datenübermittlung)!

      … widerspricht sich nur scheinbar. Im ersten Fall beziehe ich mich speziell auf das (Fehl-) Verhalten des betreffenden IE, bei dem klemmt offenbar irgendwas. Letzteres bezieht sich auf das eigentlich übliche Verhalten, so, wie es sein sollte.

      Das Standardverhalten sieht folgendermaßen aus:

      • Objekt nicht im Cache: Abrufen.
      • Objekt ohne Verfallsdatum (Expires / Cache-Control) im Cache: Anfragen, ob seit letztem Aufruf geändert (If-Modified-Since / Not modified).
      • Objekt mit Verfallsdatum im Cache: Nicht mehr anfragen, bis Verfallsdatum erreicht (falls in den Browser-Einstellungen nicht anders definiert).
    2. Hallo,

      Es sei aber angemerkt, dass das Browser-Standardverhalten vorsieht, bei _jedem_ Zugriff auf ein Objekt dieses beim Server anzufragen, auch, wenn das Objekt bereits im Browser-Cache liegt (in dem Fall wird nur ein Abgleich durchgeführt, keine Datenübermittlung)!

      das ist zwar wünschenswert, wird aber von den wenigsten Browsern so gemacht. Üblich ist, dass eine neue Anfrage erst dann rausgeht, wenn der Browser "glaubt", die Version im Cache könne vielleicht nicht mehr aktuell sein. Besonders der IE cacht in der Defaulteinstellung sehr aggressiv und lässt sich nur mühsam überzeugen, doch mal neu anzufragen.

      Nun gibt es in Browsern die Möglichkeit, das Caching-Verhalten manuell zu ändern. Deshalb solltest du den Kunden bitten, seine Browser-Einstellungen diesbezüglich zu überprüfen (IE-Menü Extras -> Internetoptionen -> Seite Allgemein -> Temporäre Dateien -> Einstellungen). Die Option "Automatisch auf aktuelle Versionen prüfen" müsste IMHO richtig sein, "bei jedem Start" wäre auch noch ok, "niemals" ist aber definitiv falsch, "immer" überaus unklug.

      Nein, "immer" entspricht genau dem Verhalten, dass du oben beschrieben hast: IE setzt einen bedingten Request ab (mit If-Modified-Since), und der Server antwortet ggf. mit 304 Not Modified, dann nimmt der IE die im Cache gespeicherte Version. "Automatisch" ist hier die Defaulteinstellung, die leider immer wieder zu Ärgernissen führt.

      So long,
       Martin

      --
      F: Was ist ekliger als ein angebissener Apfel mit einem Wurm drin?
      A: Ein angebissener Apfel mit einem halben Wurm.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    3. hi,

      ... Die Option "Automatisch auf aktuelle Versionen prüfen" müsste IMHO richtig sein, "bei jedem Start" wäre auch noch ok, "niemals" ist aber definitiv falsch, "immer" überaus unklug.

      "Automatisch" ist das Problem. Eben hier entscheidet der Browser ob die Seite neu angefordert wird und macht das nicht immer, obwohl es wünschenswert wäre.

      "Immer" ist die richtige Wahl. Eben dann, wenn die Webanwendung korrekte Header liefert und die Webanwendung sich selbst um das Cache-Verhalten kümmert (304 Management).

      Hottü