Ich habe neben meiner WP-Installation im Wurzelverzeichnis auch noch ein kleines PHP-Skript zu liegen, welches mir die originalen Log-Dateien des Servers nach eingegangenen Suchmaschinenanfragen auswertet. Bei der Ausgabe der Ergebnisse verwende ich zur Formatierung eine CSS-Datei.
Nun hatte ich bei einer Umstellung zwar das PHP-Skript wieder aufgespielt, die CSS-Datei jedoch vergessen. Beim ersten Aufruf sahen die Ausgaben deswegen dann ein wenig komisch aus. Aber kein Problem dachte ich, CSS-Datei schnell nachgeschoben und das Skript neu gestartet. Nur änderte sich gar nichts, es sah so aus, als ob die CSS-Datei nicht existiert, obwohl sie definitiv da ist. Ein kurzer Gegencheck mit dem IE bestätigt dann auch, das eigentlich kein Problem vorliegt, hier wurde alles korrekt angezeigt.
Dann bin ich der Sache nachgegangen und habe den Ablauf rekonstruiert. Was passiert nun?
Die für die Permalinks eingestellten ModRewrite-Regeln prüfen zunächst, ob die angeforderte Ressource eine real existierende Datei oder ein Verzeichnis ist. In dem Fall liefert der Webserver die Daten selber aus, alles andere wird an die WP-eigene index.php weitergereicht.
Diese prüft, ob es sich um eine WP-Seite, also Artikel, Kommentar usw. handelt und gibt diese dann aus. Falls nicht, wir ein Fehler 404 erzeugt und die entsprechende Fehlerseite ausgegeben. Und genau hier liegt das Problem.
WP erzeugt im Fehlerfall mit der Funktion nocache_headers() einen entsprechenden HTTP-Response-Header, der zwar so Sachen wie:
enthält, aber auch ein Feld Last-Modified:,welchem die aktuelle Serverzeit zugewiesen wird.
Firefox scheint sich für die no-cache Sachen nicht so recht zu interessieren, sondern nimmt den Last-Modified-Eintrag als Anlaß, beim nächsten Aufruf im Request-Header mit If-Modified-Since dem Server die Möglichkeit zu geben, gegebenenfalls mit einem 304 Not Modified zu antworten.
Und genau das tut er dann korrekterweise auch, wenn die vorher vergessene Datei wieder da ist, aber ein Datum/Zeit-Wert von vor zwei Stunden, zwei Tagen oder zwei Jahren hat.
Worauf ich hinaus will, es ist aus meiner Sicht Unsinn, bei einem 404-Fehler einen Last-Modified-Eintrag mitzuschicken, denn was bitte soll diese Angabe darstellen. Von einer Ressource, die nicht da ist, kann ich schlecht sagen, wann sie das letzte mal geändert wurde. Der Apache selber schickt bei einem 404er übrigens keinen Datum/Zeitstempel mit.
Ich habe auch mal probeweise diese Last-Modified-Zeile in der WP-Funktion
nocache_headers() auskommentiert, und siehe da, die Welt ist wieder in Ordnung.
Gruß
Ingo