Caching, Plan B

Das Verfallsdatum für eine Datei anzugeben, ist eine gute Idee. Apache hält für diesen Fall das Modul "Expires" bereit. Was aber, wenn der Provider das Modul partout nicht anbieten mag?

Caching

Gute Webmaster definieren für ihre Dateien und Dokumente ein Verfallsdatum. Dadurch wissen Browser und Proxies, wann sie das Objekt erneut abrufen sollen. Das spart Traffic und beschleunigt das Laden von Seiten. Außerdem bewerten einige Suchmaschinen performante Websites besser und platzieren diese in den Suchergebnissen höher.

Plan A

Das erwähnte Apache-Modul "mod_expires" [1] deckt den beschriebenen Anwendungsfall ab. In der .htaccess-Datei kann für jeden Datei-Typen (mime-type) eine entsprechende Festlegung mit der Direktive "ExpiresByType" getroffen werden. Ein Beispiel:

ExpiresByType text/css A604800

Es wird festgelegt, dass CSS-Dateien (text/css) nach dem Aufruf (A = access) 604.800 Sekunden, also 7 Tage, im Cache verbleiben dürfen und nicht neu geladen werden sollen.

Eigenwilliger Provider

Was macht man aber, wenn der Provider das Modul "Expires" nicht zur Verfügung stellt oder dafür Extrakohle will? Dann greift Plan B. Dafür brauchen wir die .htaccess-Datei und Anweisungen die fast immer zur Verfügung stehen.

Plan B

Benötigt wird die Apache-Kernfunktion <Files> [2] und die Direktive "header" des Apache-Moduls "mod_headers" [3]. Beides steht im Normalfall bereit und hilft, das Problem zu lösen.

Die Lösung

Im <Files>-Tag wird ein Suchmuster notiert. Entspricht eine aufgerufene Datei diesem Muster, dann "greifen" die notierten Konventionenen innerhalb des <Files>-Tags. Im konkreten Fall ist es das Kommando "Header", das Infos über die Haltbarkeit der Datei an den anfordernden Client sendet.

Nachfolgend ein Code-Beispiel für einen .htaccess-Eintrag:

<Files ~ "\.(html|php)$">
Header set Cache-Control "max-age=0"
</Files>
<Files ~ "\.(css|js|pdf|swf)$">
Header set Cache-Control "max-age=604800"
</Files>
<Files ~ "\.(gif|jpg|png)$">
Header set Cache-Control "max-age=2592000"
</Files>

Die erste Zeile enthält einen Suchbegriff für Dateien, die mit .html oder .php enden. Die Anweisung in Zeile 2 legt fest, dass das maximale Alter dieser Dateien 0 betragen soll. Mit anderen Worten: Dateien mit dieser Endung werden immer neu geladen. Sinnvoll ist das, wenn die Dokumente dynamisch generiert werden oder wenn man aus statistischen Gründen alle Hits zählen will. Zeile 3 schließt die Anweisung ab.

In Zeile 4 kümmern wir uns um CSS-, JavaScript-, PDF- und Flash-Dateien. Für diese definieren wir in Zeile 5 das Haltbarkeitsdatum von einer Woche (604.800 Sekunden). Zeile 6 schließt unsere Festlegung ab.

Zeile 7 gibt Anweisungen für Grafiken. GIF-, JPG- und PNG-Dateien dürfen gemäß der achten Zeile 30 Tage (2.592.000 Sekunden) im Cache verweilen bevor sie neu geladen werden. Zeile 9 beendet die Anweisung für die Grafikdateien.

Und das war es.

Praxistipp

Im Beispiel wird mit regulären Ausdrücken gearbeitet. Für die Anpassung des Beispiels für den eigenen Anwendungsfall empfiehlt es sich, mit dem Thema "RegEx" zu befassen.

Wermutstropfen

Nach meinem jetzigen Kenntnisstand greifen die Festlegungen nicht, wenn man Dateien über ein URL-Rewrite erzeugt. Wird beispielsweise eine RSS-Datei (.rss) durch eine Datei mit der Endung .php generiert, gilt für diese die PHP-Konvention und nicht eine eigens notierte RSS-Angabe. Das muss man in Kauf nehmen.

Finale Empfehlung

Derartige Spielereien sollte man lokal testen. Browser-Plugins (Firebug & Co.) helfen einem dabei, die Ergebnisse zu messen und zu verifizieren. Ob das alles klappt, sieht man leider in diesem Anwendungsfall erst im Live-Test beim unwilligen Provider. Tests sollte man in besuchsarmen Tageszeiten durchführen. Das ist aber ohnehin eine gute Idee.

[1] Apache Module mod_expires (apache.org)
[2] Apache Core Features (apache.org)
[3] Apache Module mod_headers (apache.org)


Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0