Jan

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 ;)

7 Kommentare bis jetzt

  1. Kommentar von Patrick:

    Sau vielen Dank, werde mal sehen, ob sich etwas verbessert

  2. Kommentar von Vitali:

    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!

  3. Kommentar von Frank Weber:

    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

  4. Kommentar von Wagner:

    Super erklärt. Danke für die hilfe.

  5. Kommentar von Peter:

    schön erklärt, probiere mal aus.
    Peter

  6. Kommentar von nord:

    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

Track-/PingBacks

  1. Page Speed Optimierung » mySHA.de:

    […] Server Error”. Das Problem: Das Caching Plugin will Cache-Control und Expires Header via .htaccess steuern, leider war mein recht restriktiv eingestellter Webserver damit nicht ganz so […]

Kommentar hinterlassen

You must be logged in to post a comment.

Archiv

Zufällige Bilder

  • Chinesischer Streifenhamster: Nils
  • loads.in - blog.splash.de loads in 1.4 seconds
  • typeracer1

Kommentare (28 Tage)

Sonstiges


Bloggeramt.de