Michael Schröpl: Datei oder nicht?

Beitrag lesen

Hi,

andererseits der Server entsprechende Angaben
mitsenden würde, um den Browser von diesen
unsinnigen Prüfungen abzuhalten (das zu tun
ist Serverkonfiguration, geht also nicht von
selbst - und es hat leider auch seine Nachteile).
Bitte erläutere das! Wie muss ich den Server
einstellen?

HTTP-Header mitsenden, welche dem Browser sagen, wie lange er bitte _nicht_ mehr nachfragen soll, ob der Inhalt seines Caches noch etwas taugt:

Lesetips (Apache):
http://httpd.apache.org/docs/mod/mod_expires.html
http://httpd.apache.org/docs/mod/mod_headers.html

Der Browser muß dazu aber auch mitspielen.
Netscape 4 tut das prima (selbst wenn er auf "check always" steht, glaubt er "Expires:"-Header bedenkenlos - HTTP/1.1 versteht er eh nicht).
M$IE und Mozilla sollten in der Cache-Konfiguration auf "automatisch" stehen - dann glauben auch sie den mitgeschickten Headern (falls vorhanden) und hören auf, ständig zu fragen.
Das ist eventuell auch eine Vertrauensfrage gegenüber den Benutzern. Einige von denen haben vielleicht Angst, durch zu aggressives Caching aktuelle Änderungen nicht mitzubekommen - und sie haben dabei nicht ganz unrecht.
Allerdings können sie selbst natürlich einen expliziten Server-Zugriff erzwingen, wenn sie mit ihrem Browser umgehen können (Shift-Reload in Netscape, Cntrl-F5 in M$IE).

Welche Nachteile genau muss ich befürchten?

Solange Du anschließend nichts mehr ändern willst - erst mal keine.
Aber bedenke, daß die Browser sich dann eben die Inhalte wirklich so lange merken, wie Du es ihnen geraten hast!

Wenn Du da beispielsweise "eine Woche" empfohlen hast und dann an Deinen Seiten irgendwas änderst, dann hast Du bis zu eine Woche lang eine Migrationsphase, in welcher in den Browsern alte bzw. neue Versionen Deiner Seite drin sein können - und eventuell sogar beide Versionen gemischt bei einer inhaltlich zusammengehörigen Datei-Menge. (Das macht beispielsweise eine eventuelle Fehlersuche sehr viel lästiger.)
Du darfst also beispielsweise nicht Dateien löschen, auf welche Du in der vorherigen Version noch verwiesen hast, bloß weil Du jetzt eine neuere Version hochgeladen hast - für die Dauer der Migrationsphase müssen alle referenzierten Objekte noch weiter existieren.
Natürlich könnte man das Problem entschärfen, indem man Dateien nicht ändert, sondern neue Dateien unter neuen Namen anbietet. In diesem Falle verletzt man aber das "heilige" Prinzip "ewiger" URLs ... auch nicht schön, vor allem wenn man über Suchmaschinen gefunden werden möchte und diesen keine broken links spendieren will.

Du mußt also bei Änderungen entweder viel besser aufpassen (selbst ein automatischer Links-Checker reicht nun nicht mehr) oder 'rechtzeitig' vor einer Änderung diese Header-Erzeugung wieder abschalten und das aggressive Caching "austrudeln lassen".
Und letzteres läßt den Performance-Gewinn dann erst mal wieder verschwinden, bis nach der Änderung die Browser-Caches sukzessive wieder geladen werden. Zudem bedeutet dies natürlich, daß Du lange vorher wissen mußt, ob Du etwas ändern willst ...

Und außerdem solltest Du dann für sich tatsächlich oft ändernde Seiten auch entsprechende Header senden, welche dort das Caching abschalten oder kurz halten.
Über hinreichend feine Apache-Konfigurationen (<FilesMatch> etc.) kannst Du theoretisch für jede einzelne Datei individuelle Header erzeugen, falls Du so viel Arbeit investieren willst. Sinnvoller ist wahrscheinlich, über Namensmuster der Dokumente (bzw. ihrer Pfade) entsprechende Caching-Klassen zu bilden und das Problem mit einer Handvoll regulärer Ausdrücke anzugehen.

Viele Grüße
      Michael