de.comp.lang.php.* FAQ

27.8. Wie kann ich das Caching einer Seite verhindern?

Keywords: Cache | Reload | Lebensdauer | Browser

Antwort von Kristian Köhntopp

In HTTP 1.0 kann man das Caching einer Seite nur unvollständig steuern. Die ersten Webcaches haben die Lebensdauer von Seiten im Cache auf der Grundlage des Erzeugungsdatums geschätzt oder, wenn ein Expires-Header angegeben, diesen beachtet. Später ist der spezielle Header Pragma: no-cache eingeführt worden, um das Caching von Seiten durch Webcaches und Browser zu verbieten.

Erst mit HTTP 1.1 kann eine spezielle Cache-Steuerung hinzu, die zwischen privaten (browsereigenen) Caches und öffentlichen Caches unterschied. Über den besonderen Header Cache-Control kann man die Lebensdauer von Seiten in Caches steuern.

Microsoft kocht zusätzlich noch eine Spezialsuppe, indem sie für den MSIE 5.x spezielle Cache-Control Extensions definieren.

Um das Caching einer Seite zu erlauben, kann man den folgenden Code verwenden:

$expire = 15;  // Lebensdauer der Seite im Cache in Minuten

$exp_gmt = gmdate("D, d M Y H:i:s", time() + $expire * 60) ." GMT";
$mod_gmt = gmdate("D, d M Y H:i:s", getlastmod()) ." GMT";

// HTTP 1.0
header("Expires: " . $exp_gmt);
header("Last-Modified: " . $mod_gmt);

// HTTP 1.1
header("Cache-Control: public, max-age=" . $expire * 60);

Um das Caching einer Seite auf private Caches zu begrenzen muss man Code wie diesen nehmen:

$expire = 15;  // Lebensdauer der Seite im Cache in Minuten

$mod_gmt = gmdate("D, d M Y H:i:s", getlastmod()) ." GMT";

// HTTP 1.0 kennt keine privaten Caches, also nix cachen
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . $mod_gmt);

// HTTP 1.1
header("Cache-Control: private, max-age=" . $expire * 60);

// MSIE 5.x special
header("Cache-Control: pre-check=" . $expire * 60, FALSE);

Um das Caching einer Seite zu verhindern, ist der folgende Code passend:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") ." GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");
header("Cache-Control: post-check=0, pre-check=0", FALSE);

Ein anderer Trick, mit dem man das Caching einer Seite gut verhindern kann, ist das Anhängen von Parametern an die URL einer Seite in der Form http://www.meinserver.de/bla.php?x=y oder das Einfügen von benutzerspezifischen Komponenten in die URL (in den Hostnamen, den Pfad oder den Dateinamen).

Valid HTML 4.01! Valid CSS!

27.8. Wie kann ich das Caching einer Seite verhindern?
http://www.php-faq.de/q/q-http-caching.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team