Drupalseiten einfach für Mobile aufbereiten (Tutorial) – Teil II

Mobile

Im ersten Teil ging es darum, das Theme zu wechseln, sobald ein Benutzer mit einem Mobiltelefon kommt. Das ging ja auch ganz einfach, wir verlieren dabei jedoch Cachingmöglichkeiten. Für kleinere Seiten sicher kein Problem, falls es etwas grösser wird jedoch undenkbar.

Caching wird ab einer bestimmten Popularität der Webseite unumgänglich. Daher ist es doch sehr erstrebenswert, auch für unser Problem eine Lösung zu finden. Wollen wir doch zuerst mal ganz schnell ein paar Cachingmechanismen in Drupal anschauen:

  • Einzelne Elemente cachen (z.B. Blockcache). Nehmen wir an, wir hätten einen Block der die Weltformel berechnet und das dauert 20 Sekunden. Wir wollen natürlich nicht, dass diese bei jedem Seitenaufruf neu berechnet werden wird, da das Resultat jeden Tag gleich bleibt: Wir berechnen den Block einmal und zwischenspeichern (cachen) das Resultat. Dem nächsten Besucher wird dann der bereits berechnete Block serviert.
  • Für den anonymen Besucher wird die ganze Seite gecached. Z.B. der Page Cache oder Boost. Vom Prinzip her genau gleich wie das Beispiel vorher, aber halt auf die ganze Seite bezogen.

Nehmen wir also an, wir schalten den Page Cache an:

  1. Ein Besucher (Fritz) kommt. Drupal und die Datenbank rechnen und rendern. Die Seite wird ausgegeben und das ausgegebene Stück HTML wird zwischengespeichert.
  2. Ein weiterer Besucher (Hans) kommt auf die selbe Seite. Bevor Drupal überhaupt irgend etwas macht, wird im Cache geschaut, ob da evtl. bereits etwas vorhanden ist: Hurra, ja: Seite servieren und schluss.
  3. Ein IPhone Jünger (Steve, natürlich via IPhone) kommt auf eine neue Seite (die weder Fritz noch Hans vorher besucht haben). Drupal schaut im Cache, findet nichts. Drupal merkt, aha, hier kommt ein IPhone daher, also Theme umstellen. Jetzt wird gearbeitet und die Seite zusammengestellt und das HTML schlussendlich ausliefern und im Cache ablegen.
  4. Hans folgt Steve. Drupal schaut wieder im Cache und findet eine Seite, weiss jedoch nicht, dass die im Cache liegende Seite eigentlich nur für Mobilgeräte gültig ist. Hans bekommt nun die Mobileseite ausgeliefert… er wird wohl nicht wirklich begeistert sein.

So. Wir haben also zwei Möglichkeiten. Beide sind in Drupalumsetzbar:

  1. Die Mobileseite so auslieferen, dass Drupal für Mobile und Desktop das Gefühl hat es wäre eine andere Seite (mittels Subdomain)
  2. Den Cachingmechanismus so anpassen, so dass er nach Theme unterscheidet.

Ich habe mich für die erste Möglichkeit entschieden, da diese viel einfacher umsetzbar ist:

  1. Einen Domainalias http://m.rapsli.ch anlegen (die Domain zeigt auf den gleichen Server wie rapsli.ch), ein sog. Domain Alias. Leider wird diese Möglichkeit nicht von allen Hostern angeboten (besonders nicht von den günstigen).
  2. Jetzt geht es nur noch darum, mobile Geräte auf diese Domain weiterzuleiten. Dazu dient ein einfacher Eintrag in der Datei .htaccess

1. RewriteCond %{SERVER_NAME} !^m.rapsli.ch$ [NC]

a bunch of user agent tests

  1. RewriteCond %{HTTP_USER_AGENT} (nokia|symbian|iphone|blackberry|android) [NC]
  2. RewriteRule ^(.*)$ http://m.rapsli.ch [L,R=301]

Kurze Erklärung dazu:

Zeile 1: Da es es lediglich um einen Domain Alias handelt, verwenden beide Domains das gleiche .htaccess. Um zu vermeiden, dass ein Mobilgerät immer wieder weitergeleitet, machen wir auf der Subdomain nichts.
Zeile 2: Wir stellen die Bediengung, dass es nokia, symbian, iphone,…. ist
Zeile 3: Falls das alles zutrifft, dann machen wir die Weiterleitung auf m.rapsli.ch

Das war es dann eigentlich auch schon. Jetzt können wir den Cache auch wieder einschalten.