Sie sind hier:  Startseite Wühltisch Webseitenerstellung Korrektes Datum im HTTP-Header erzwingen mit PHP


HTTP-Header „last-modified” auf Zeitstempel des aktuellen PHP-Skriptes setzen

↓ Problem
↓ Lösung
↓ Voraussetzungen und Warnungen

Problem

PHP wird für Content-Management-Systeme verwendet. Dabei kann es vorkommen, dass der Inhalt einzelner Artikel über Monate oder Jahre hinweg gleich bleibt. PHP-Skripte generieren jedoch bei jedem Aufruf einen ”last-modified”-Header mit dem aktuellen Zeitpunkt. Immer wenn der Browser eine HEAD-Anfrage stellt oder eine GET-Anfrage mit dem Zusatz „if-modified-since:” wird er die Antwort bekommen, dass das gewünschte Dokument soeben aktualisiert wurde.

Unveränderte Navigationsleisten werden jedes Mal neu geladen. Bei schnellen privaten Internetzugängen fällt das dem Leser nicht auf; jedoch bei öffentlichen Zugängen mit mehreren Rechnern. Auch eine größere Belastung des Servers und der Infrastruktur sind die Folgen. Bei Computern, die nur zeitweise mit dem Internet verbunden sind (mobile Endgeräte im UBahntunnel) ist der Effekt am deutlichsten. Sie weigern sich u.U., bereits geladene Inhalte aus dem automatischen Zwischenspeicher erneut anzuzeigen.

Für manche Webautoren ist dieses Verhalten PHPs unerwünscht. Sie wünschen sich, dass bei dem Aufruf ihrer PHP-Skripte der Zeitstempel des Skripts ausgegeben wird so wie bei einer simplen HTML-Datei.

Lösung

PHP macht manche HTTP-Header selbst. Bei einfachen HTML-Dateien werden alle HTTP-Header vom Server generiert. Meine erste Idee war, die Generierung des Headers in der PHP-Konfiguration zu unterbinden. Da ich auf die php.ini keinen Zugriff habe, habe ich diese Idee gleich verworfen. Meine zweite Idee war, in der Serverkonfiguration die Header vom PHP für ungültig zu erklären. Auch das hat nicht funktioniert; hätte sich wahrscheinlich auf eine Verdoppelung belaufen.

Wenn ich die Ausgabe des Headers nicht unterbinden kann, gibt es nur eine Alternative: Ich muss selbst bestimmen was darin stehen soll. Ich habe im Internet mehrere gute Ansätze gefunden, nur leider keine richtige Komplettlösung. Von allen Codes habe ich mir das Beste herausgesucht, zusammengefügt und die übrigen Fehler behoben. Meinen fertigen Code dürfen Sie ohne Wenn und Aber kopieren. Ich würde mich freuen, wenn Sie mich freiwillig in Ihren Quellnachweisen erwähnen.

<script language="php"> header( "Last-Modified: " . gmdate( "D, d M Y H:i:s", filemtime( $_SERVER['DOCUMENT_ROOT'] .'.'. $PHP_SELF ) ) . " GMT" ) ;</script> <html> <!-- Wichtig: Der Skriptbereich muss ganz am Anfang sein. Noch nicht ein Mal ein HTML-Kommentar darf darüber stehen! //-->

Voraussetzungen und Warnungen

Mit PHP werden Inhalte dynamisch generiert in Abhängigkeit von Formulardaten und von Einstellungen, die der Benutzer auf der Website gespeichert hat. Während die Adresse, auf die der Leser zugreift, sich im Idealfall nie ändert, kann sich der Inhalt mit jedem Zugriff automatisch ändern und sehr oft soll er das auch tun.

Auch wenn man mit dem obigen Code unnötige Transaktionen vermeiden kann, werden damit u.U. auch erwünschte Transaktionen unterbunden. Bei weniger wichtigen Änderungen können Sie es theoretisch dem Leser überlassen, ob er mit F5 das Neuladen erzwingen will. Jedoch ließ sich der sonst so zuverlässige Firefox 3.6.13 im Praxistest nicht so einfach dazu zwingen – da muss man schon in die Wuehltisch greifen.

Geburtstagskinder auf der Startseite und ähnliche Scherze sind dann nicht mehr mehr möglich; es sei denn, Sie würden das Protokoll in Abhängigkeit vom Geburtstagskalender um weitere Header ergänzen – ein unermesslicher Aufwand. Und mag das auch Offlinebrowsen auch noch so bequem sein; in passwortgeschützten Bereichen ist es doch eher kontraproduktiv. In manchen Fällen ist es also besser, auf die Übermittlung des „korrekten” Zeitstempels zu verzichten. Damit Sie in keine dieser Fallen treten habe ich eine kurze Checkliste zusammengestellt mit Bedingungen, unter denen Sie den Code nicht verwenden dürfen.

Ausschlusskriterien

Formulare, die mit der Methode GET versendet werden, sind davon nicht betroffen. Die Argumente werden an die URL des Skripts angehängt. Die vollständige URL ist somit unterscheidbar von anderen Antworten desselben Skripts, die sich nebeneinander im Browsercache befinden können. Ob es inhaltlich einen Sinn ergibt, wenn die unterschiedlichen Ergebnisse alle denselben Zeitstempel tragen, der älter ist als sie selbst, ist fraglich. Nach meinem Dafürhalten gehören redaktionelle Zeitangaben in die HTML-Metadaten und nicht ins Protokoll.


Sie sind hier:  Startseite Wühltisch Webseitenerstellung Korrektes Datum im HTTP-Header erzwingen mit PHP