29
Cache-Kontrolle beim Apache via .htaccess
Um GravatarLocalCache sinnvoll zu nutzen ist es notwendig, dass die ausgelieferten Dateien auch im Proxy bzw. Cache des Browsers zwischengespeichert werden. Bei HTTP/1.1 ist hierfür die Direktive „Cache-Control“ verantwortlich.
Wobei die Cache-Kontrolle nicht nur bei GLC sondern allgemein sinnvoll ist, da statische Daten (z.B. Bilder) ruhig länger im Browsercache verweilen dürfen und so Bandbreite sparen und helfen die Ladezeit der Seite zu verkürzen, da sie nicht bei jedem Seitenaufruf erneut heruntergeladen werden müssen.
Im folgenden Möchte ich 2 Methoden für den Weberserver Apache vorstellen.
Eine Möglichkeit die Zeit des Cachens zu beeinflussen ist das Modul „mod_expires“. Es lässt sich (sofern vom Server erlaubt) auch via .htaccess steuern, die Einstellungen könnten z.B. wie folgt aussehen:
<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 300 seconds" ExpiresByType image/gif "access plus 1 month 1 hour" ExpiresByType image/jpg "access plus 1 month 1 hour" ExpiresByType image/jpeg "access plus 1 month 1 hour" ExpiresByType image/png "access plus 1 month 1 hour" ExpiresByType application/x-shockwave-flash "access plus 1 day 1 hour" </IfModule>
Falls auch CSS/JavaScript-Dateien länger im Cache verbleiben dürfen, könnte man noch folgendes hinzufügen:
ExpiresByType text/css "access plus 1 day 1 hour" ExpiresByType text/javascript "access plus 7 days 1 hour" ExpiresByType application/x-javascript "access plus 7 days 1 hour"
Damit werden die Header, sofern mod_expires zur Verfügung steht, enstprechend angepasst. Bei allen Dateien wird eine Cachezeit von 300 Sekunden gesetzt, bei Bildern (gif, jpg,jpeg,png) bzw. bei Flash-Dateien entsprechend höher (1 Monat + 1 Stunde bzw. 1 Tag + 1 Stunde). Es lassen sich weitere Dateitypen entsprechend hinzufügen. Weitere Möglichkeiten von mod_expires sind in der Apache Dokumentation zu finden, wobei generell eine Konfiguration via http.conf vorzuziehen ist.
Eine zweite Möglichkeit ist die Steuerung direkt mittels entsprechend umgeschriebener Header, allerdings muss/sollte hier das Verfallsdatum explizit gesetzt werden (sinnvoll ist ein Datum weit in der Zukunft, damit man nicht ständig das Datum anpassen muss), die Direktive Cache-Control sollte ein neues Herunterladen der Datei schon früher erlauben:
<FilesMatch "\.(gif|flv|jpg|jpeg|png|gif|swf)$"> FileETag -INode MTime Size # if you use ETags, you should unset Last-Modified Header unset Last-Modified Header set Cache-Control "max-age=86400, public, must-revalidate" Header set Expires "Thu, 31 Dec 2010 20:00:00 GMT" </FilesMatch> <FilesMatch "\.(htm|html|php)$"> FileETag None Header set Cache-Control "max-age=86400, public, must-revalidate" </FilesMatch> <FilesMatch "\.(js|css)$"> FileETag None Header set Cache-Control "max-age=604800, public, must-revalidate" Header set Expires "Thu, 31 Dec 2010 20:00:00 GMT" </FilesMatch>
Wobei die Zeit (max-age) in Sekunden angegeben ist (z.B. 604800 = 60 Sekunden * 60 Minuten * 24 Stunden * 7 Tage)
Wenn man z.B. will, das dynamisch, d.h. via Skript generierte Seiten, nicht im Cache des Browsers/Proxy landen sollten, so könnte man dies wie folgt versuchen (schlussendlich kann man das Cachen nicht verhindern, die Werte sind nur Empfehlungen):
<FilesMatch "\.(php|cgi|pl|htm)$"> ExpiresDefault A0 Header set Cache-Control "no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, no-transform" Header set Pragma "no-cache" </FilesMatch>
Um nicht nach ein paar Tagen genervt zu sein, sollte man sich allerdings vorher Gedanken machen, wie lange Dateien im Cache des Besuchers verweilen sollten (damit die Besucher nicht irgendwann nur Daten aus dem Cache ihres Browser angezeigt bekommen). Wer den entsprechenden Header einer Datei sehen möchte, kann dies z.B. bei Firefox mit Hilfe des Add-ons Web Developer bewerkstelligen (Informationen -> Antwort Header anzeigen). Ein entsprechender Header könnte z.B. so aussehen:
Date: Fri, 29 Jan 2010 11:59:35 GMT Server: Apache Last-Modified: Fri, 01 Jan 2010 12:45:01 GMT Accept-Ranges: bytes Content-Length: 3076 Cache-Control: max-age=2595600 Expires: Sun, 28 Feb 2010 12:59:35 GMT Content-Type: image/png X-lori-time-2: 1264766442639 200 OK
Zum Schluss bleibt mir nur noch viel Spass beim Optimieren zu wünschen und testet eure Einstellungen einfach in einem nicht genutzten Unterverzeichnis oder auf einem Testserver ;)
16. September 2011 um 18:49:11
Sau vielen Dank, werde mal sehen, ob sich etwas verbessert
25. Januar 2012 um 22:54:00
Vielen Dank, es funktioniert aber laut Page Speed komischerweise bei Javascript nicht. Und zwar nicht bei allen Dateien, sondern bei einigen.. Verstehe es nicht, trotzdem Danke!
11. Mai 2012 um 14:30:39
Sehr gut erklärt und auch für mich auch ohne grosse Kenntnisse sehr gut nachvollziehbar.
Merci für die gute Hilfe und viele Grüsse aus der Schweiz von Frank
23. Januar 2013 um 00:37:55
Super erklärt. Danke für die hilfe.
8. April 2013 um 10:30:50
schön erklärt, probiere mal aus.
Peter
12. August 2013 um 08:10:36
Du schreibst etwas wonach ich schon nach einer ganzen Weile suche. Zitat: „Eine zweite Möglichkeit ist die Steuerung direkt mittels entsprechend umgeschriebener Header…“. (Cache-Control)
Ist hier gemeint, dass es sich mit der zuerst beschriebenen Möglichkeit ‚Expires‘ und der danach beschriebenen mittels ‚Cache-Control‘ um 2 in ihrer Auswirkung identische Methoden handelt? In anderen Worten: Es genügt eine der beiden zu verwenden?
Ich habe bei meinen Recherchen jede Menge Beispiel .htaccess Dateinen gefunden die beide Methoden enthalten. Ist das nötig? Überspezifiziert? Weißer Schimmel !?
Vielleicht ist es egal, ich hätts gern gewusst :-)
Mein Shop läuft auf einem Apache Server.
In vielen