Das Örtchen RSS-Feed
Kategorie
Kategorie: Blog
Buttons & Statistiken
Neueste Kommentare

Drupal: Sinnvolle Optimierungen (Teil 2)

Im ersten Artikel dieser Reihe habe ich Möglichkeiten zur Reduzierung von Requests in Drupal 6 beschrieben und wie man die ausgelieferten Daten mit GZIP kompimieren kann. Trotz der beschriebenen Änderungen kamen von YSlow immer noch Meldungen im Bereich "Add Expires headers" und von Page Speed im Bereich "Specify a Vary: Accept-Encoding header".

Die Probleme

Zunächst wollte ich mich um die Meldung von YSlow kümmern, da sie mich am meisten verwunderte. Die .htaccess-Datei von Drupal 6 enthält normalerweise immer nachfolgende Zeilen:

# Requires mod_expires to be enabled.
<IfModule mod_expires.c>
  # Enable expirations.
  ExpiresActive On

  # Cache all files for 2 weeks after access (A).
  ExpiresDefault A1209600

  <FilesMatch \.php$>
    # Do not allow PHP scripts to be cached unless they explicitly send cache
    # headers themselves. Otherwise all scripts would have to overwrite the
    # headers set by mod_expires if they want another caching behavior. This may
    # fail if an error occurs early in the bootstrap process, and it may cause
    # problems if a non-Drupal PHP file is installed in a subdirectory.
    ExpiresActive Off
  </FilesMatch>
</IfModule>

Somit sollten eigentlich alle Dateien (außer PHP) automatisch ein Ablaufdatum zwei Wochen nach Abruf erhalten. Dies scheint so jedoch nicht narrensicher zu sein. Eine Lösung bot der im vorherigen Artikel verlinkte Beitrag für die On-The-Fly-Methode zur GZIP-Komprimierung. Er enthält gleich zwei Varianten.

Variante eins nutzt mod_expires.c, was ja schon für den Default-Wert nicht wirklich zu klappen scheint. Deswegen habe ich Variante zwei unter Nutzung von mod_headers.c ausprobiert. Hierfür habe ich den nachfolgenden Code am Ende meiner .htaccess-Datei (im Hauptordner von Drupal) ergänzt:

# Cache Headers
<IfModule mod_headers.c>
  # Cache specified files for 31 days
  <filesmatch "\.(ico|flv|jpg|jpeg|png|gif|swf)$">
  Header set Cache-Control "max-age=2678400, public"
  </filesmatch>
  # Cache HTML files for a couple hours
  <filesmatch "\.(html|htm)$">
  Header set Cache-Control "max-age=7200, private, must-revalidate"
  </filesmatch>
  # Cache PDFs for a day
  <filesmatch "\.(pdf)$">
  Header set Cache-Control "max-age=86400, public"
  </filesmatch>
  # Cache CSS for 6 days
  <filesmatch "\.(css|css.gz)$">
  Header set Cache-Control "max-age=518400, private"
  </filesmatch>
  # Cache Javascripts for 31 days
  <filesmatch "\.(js|js.gz)$">
  Header set Cache-Control "max-age=2678400, private"
  </filesmatch>
  
  Header append Vary Accept-Encoding
</IfModule>

Es werden in Abhängigkeit von der Dateiendung Ablaufdaten festgelegt und hierbei auch die komprimierten CSS- und JavaScript-Dateien berücksichtigt, die bei den im letzten Artikel genannten Lösungen entstehen.

Achtung: Die fettmarkierte Zeile ist übrigends die Lösung für die Meldung von Page Speed (via Google webmaster-zentrale).

Nachtrag 11.02.2011

Da sich in meinem CSS kaum noch etwas ändert und zudem durch die Datei-Zusammenfassung aus Teil 1 nach CSS-Änderungen Dateien mit komplett anderen Namen entstehen, habe ich mich inzwischen für nachfolgende Änderung entschieden:

# Cache Headers
<IfModule mod_headers.c>
(...)
  # Cache CSS for 60 days
  <filesmatch "\.(css|css.gz)$">
  Header set Cache-Control "max-age=5184000, private"
  </filesmatch>
(...)
</IfModule>

Fazit

Mir ist klar, daß die beschriebenen Tipps zu einer Verlängerung der .htaccess-Datei führen. Mir ist auch klar, daß dies zu einer Erhöhung der Serverbelastung führt, da diese Datei bei jedem Request durchlaufen wird. Viele Leute nutzen jedoch normalen Webspace und können solche Änderungen nicht, wie im englischen Artikel Suddenly becoming popular on Social Media websites empfohlen, direkt in der Apache Konfiguration hinterlegen.

Hallo! Bist du neu hier? Dann abonniere doch den RSS-Feed dieses nicht mehr ganz so stillen Örtchens, um über meine geistigen Ergüsse auf dem Laufenden zu bleiben. Alternativ besteht auch die Möglichkeit, sich von FeedBurner per E-Mail über meine Ausscheidungen benachrichtigen zu lassen.

Neuen Kommentar schreiben

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
Der Inhalt dieses Feldes wird öffentlich zugänglich angezeigt, aber als rel="nofollow" markiert.
Hinweis

Kommentare beleben den Blog! Ich freue mich über jeden Kommentar. Du kannst hier offen Deine Meinung zum Artikel sagen, aber bitte beachte die Netiquette und vermeide es andere zu beleidigen.

Bitte unterlasst es die Kommentare zu SEO-Zwecken zu missbrauchen. Kommentare mit Links, die nicht zu Blogs führen (oder zu Blogs mit Grauzonen-Themen) und/oder Keywords als Namen verwenden, sind nicht erwünscht!

Möchtest Du mir einen Blog-Artikel schmackhaft machen, dann schreib die URL ohne HTML-Tag in den Kommentarbereich und ich werde diesen bei Gefallen verlinken.