Login
Newsletter
Di, 21. Februar 2006, 14:28

Geteilter VirtualHost mit SSL und mod_rewrite

Auf unserem privaten Server besitzt jeder User die Möglichkeit, eine Homepage unter der Domain username.stormbind.net zu veröffentlichen (Apache-VirtualHost).

Problematisch stellt es sich allerdings dar, den Usern verschlüsselten Zugang zu ihren Weblogs und Ähnlichem anzubieten. Da der Server nur eine IP-Adresse besitzt, ist es leider nicht möglich, für jeden User einen eigenen VirtualHost anzulegen, der entsprechend auch ein eigenes Zertifikat besitzen müsste, was den Aufwand zusätzlich erhöhen würde.

Ein Workaround zu der Problematik lässt sich allerdings recht einfach mit Hilfe von mod_rewrite und dem Feature "RewriteMap" schaffen. In unserem Fall ist der Webserver fertig konfiguriert, um Webseiten für https://www.stormbind.net/ auszuliefern, und mod_rewrite ist geladen.

Den entsprechenden VirtualHost Eintrag erweitern wir jetzt um folgendes:

#Rewrite-Engine einschalten
RewriteEngine on
#Logfile zwecks Debugging von Problemen
RewriteLog /var/log/apache2/ssl_vhost_rewrite.log
#Loglevel fuer den Regelbetrieb moeglichst gering halten
RewriteLogLevel 1
#Angabe einer RewriteMap, user-dir ist der Name dieser Map,
#der Typ ist eine Textdatei und durch einen ":" getrennt der Pfad + Name
RewriteMap user-dir txt:/etc/apache2/map.user-dir
#Hier matchen wir den Aufruf auf unsere RewriteMap
RewriteRule ^/user/([^/]+)/?(.*) ${user-dir:$1}/$2

Die RewriteMap selber sieht aus wie folgt:

#Format: <username> /pfad/zum/htdocs/verzeichnis
foo /home/vhosts/foo/htdocs

Zerlegen wir die wichtigen Teile der Rewrite-Regeln einmal im Detail:

RewriteMap user-dir txt:/etc/apache2/map.user-dir

Hier definieren wir eine »RewriteMap« mit dem Namen »user-dir«, über die wir die Inhalte bei weiteren RewriteRules ansprechen können. In unserem Fall hat diese RewriteMap den Typ einer durch Leerzeichen getrennten Textdatei.

RewriteRule ^/user/([^/]+)/?(.*) ${user-dir:$1}/$2

Hier kommt die eigentliche "RewriteRule". Für den Fall, dass ein Besucher diese Domain aufruft mit dem Verzeichnis »/user/foo« (entspricht hier https://www.stormbind.net/user/foo), versuchen wir den letzten Teil hinter dem /user/ in unserer RewriteMap mit dem Namen »user-dir« zu finden. Aus der entsprechenden Zeile entnehmen wir dann aus der zweiten Spalte, aus welchem Verzeichnis wir eine Datei ausliefern sollen. Hier finden wir das Schlüsselwort »foo« tatsächlich in unserer RewriteMap »user-dir« und als zu nutzendes Verzeichnis »/home/vhosts/foo/htdocs«.

Klingt für jemanden, der sich noch nicht mit den Fähigkeiten von mod_rewrite beschäftigt hat, sicher erst einmal sehr kompliziert. Die Dokumentation zu mod_rewrite sei da natürlich wärmstens empfohlen.

Wichtig: Wer als Default in seinem SSL-VirtualHost z.B. SSI, Indexes etc. erlaubt hat, sollte sich darüber im Klaren sein, dass seine User solche evtl. nicht gewollten Features jetzt natürlich mit verwenden können. Hier empfiehlt es sich, wie eigentlich immer, sehr restriktive Defaulteinstellungen zu wählen.

Für mehr als eine Handvoll VirtualHosts wird es sehr müßig, die entsprechende RewriteMap manuell zu pflegen. Wer z.B. alle VirtualHosts mit dem Schema »<username>.domain.vhost« in einzelne Dateien einträgt, kann sich mit folgendem einfachen Shell-Skript behelfen:

###ACHTUNG###################################
#Keine Pruefung auf doppelte Usernamen o.ae.#
#############################################
cd /etc/apache2/sites-enabled
echo "#Usermap generated on $(date) by $USER"
for x in *.stormbind.net.vhost
do
 USERNAME=$(echo $x&#124;awk -F"." '{print $1}')
 DOCROOT=$(grep DocumentRoot $x&#124;awk '{print $2}')
 echo "$USERNAME $DOCROOT"
done

Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten