

Anmelde-Formular

Strohhalm Spendenkonto
Konto-Inhaber: Mathias Bank
Konto-Nummer: 83 04 297
BLZ: 200 905 00
Kreditinstitut: Netbank AG
Hinweis: Die Spenden werden bis auf weiteres ausschließlich dafür eingesetzt, den Strohhalm gegen rechtliche Angriffe zu schützen. Ein anderer Verwendungszweck muss von der gesamten Administration genehmigt werden.
aktueller Spendenstand: 188.01 €

strohhalm Standard (aktiv) von baumeister
(Noch keine User-Stylesheets vorhanden)
Hinweis: Zum Wechseln der Styles muss ein Cookie akzeptiert werden. Jedes registrierte Community-Mitglied darf eigene Styles entwickeln und einreichen. Ausführliche Infos unter Styleswitcher-Hilfe.
Neue Styles an baumeister@strohhalm.org senden.

strohhalm.org / Magazin / Server-Management / hosts-Datei und virtuelle Hosts synchronisieren
drwitt.
.+1 -0.23. July 2005, 21:53
Jeder, der mehr als drei Web-Projekte auf seinem lokalen Webserver verwaltet, kennt den Riesenaufwand, den die Verwaltung der Webverzeichnisse mit sich bringt. Anfangs ist das Projekt noch ein Unterverzeichis des Root-Verzeichnisses, und später wird es in einen virtuellen, namensbasierten Host (vhost) umgewandelt, bevor es auf den „echten” Server geschoben wird. Dazu müssen die httpd.conf des Apachen und die hosts-datei von Windows manuell angepaßt werden, und zu allem Überfluß sind noch eventuelle mod_rewrite-Regeln in der .htaccess zu beachten und anzupassen…
Das Apache-Modul mod_vhost_alias kann nun die halbe Arbeit ersparen, indem es für Verzeichnisse unterhalb eines bestimmten Container-Verzeichnisses dynamisch namensbasierte, virtuelle Hosts kreiert. Prima! Wie richte ich meinen Apachen für mod_vhost_alias ein? – siehe
ApacheBlog [http://apacheblog.de/item/3] und
Dokumentation zu mod_vhost_alias.
Die andere Hälfte bleibt: Immer noch muss der Verzeichnisname als Host in die hosts-Datei eingetragen werden. Wie wäre es nun mit einem Skript, das beim Aufrufen die vhosts und Hostnamen automatisch abgleicht und die hosts-Datei aktualisert?
Das PHP-Script liest alle Verzeichnisnamen unterhalb des vhosts-Verzeichnisses und gleicht diese mit den Einträgen in der hosts-Datei ab. Nicht vorhandene Verzeichnisse werden ihr hinzugefügt, und Host-Einträge, zu denen kein Verzeichnis existiert, werden entfernt. Im folgenden beschreibe ich die wichtigsten Code-Abschnitte.
Hier müssen die Pfade sowie die Regulären Ausdrücke für Hostnamen in der Hosts-Datei angepaßt werden. Als Namen für Hosts sind in diesem Skript Namen aus Buchstaben, Umlauten, Zahlen, Punkten und Unterstrichen erlaubt, wobei der Name mit einem Buchstaben beginnen muss.
$hosts_file='C:\WINNT\system32\drivers\etc\hosts';
$vhosts_dir='d:\www\vhosts';
$local_vhost_name_pattern="/[a-zA-Zäöüß][\w\.\-]+/i";
$local_vhost_ip_pattern="/^\s*127\.0\.0\.1\s+/im";
Die Funktion Get_Directory_Content_Array liefert ein Array mit allen Verzeichnisnamen im vhost-Verzeichnis zurück.
$liste=Get_Directory_Content_Array($vhosts_dir, false);
$vhost_dirs=array();
while ($d = array_shift($liste))
if (is_dir($d))
array_push($vhost_dirs, basename($d));
Die hosts-Datei wird nun in ein Array eingelesen. Leerraum am Anfang und Ende jeden Eintrages wird entfernt:
$hosts_lines=file($hosts_file);
array_walk($hosts_lines,'my_trim');
Für uns sind nur die Hosts interessant, denen die IP 127.0.0.1 zugewiesen ist. Wir trennen also die Zeilen in lokale Einträge und alle anderen Zeilen und extrahieren die Hostnamen.
$local_vhosts_lines=preg_grep($local_vhost_ip_pattern, $hosts_lines);
$local_vhosts_lines=array_filter($local_vhosts_lines, 'Host_Is_Not_Localhost_Itself');
$non_local_vhosts_lines=array_diff($hosts_lines, $local_vhosts_lines);
$local_vhosts_string=implode("\n", $local_vhosts_lines);
preg_match_all($local_vhost_name_pattern,
$local_vhosts_string, $local_vhost_names);
if (!empty($local_vhost_names[0]))
$local_vhost_names = array_shift($local_vhost_names);
Zunächst werden alle einander entsprechenden Hosts und Verzeichnisse in existing_vhosts gespeichert. Dann werden alle Einträge rausgefiltert, denen kein Verzeichnis entspricht (für die Synchronisation ist dies zwar nicht erforderlich, aber für den Report am Ende benötigen wir die Namen). Letztlich werden die Verzeichnisnamen ermittelt, die in hosts nachgetragen werden müssen und in new_vhosts gespeichert.
$existing_vhosts=array_intersect($vhost_dirs, $local_vhost_names);
$remove_vhosts=array_diff($local_vhost_names, $vhost_dirs);
$new_vhosts=array_diff($vhost_dirs, $local_vhost_names);
Nun geht es fast wieder rückwärts: Wir haben die bestehenden Hosts und die neu einzutragenden. Wir ergänzen alle Hostnamen mit der IP 127.0.0.1 und setzen das Ganze zu einem Array zusammen…
$all_vhosts=array_merge($existing_vhosts, $new_vhosts);
$local_vhost_lines=array();
while($v = array_shift($all_vhosts))
array_push($local_vhost_lines, "127.0.0.1\t\t$v");
…den wir an die restlichen, nicht berücksichtigten Zeilen der hosts-Datei anhängen. Dann versehen wir alle Zeilen mit Zeilenumbrüchen und schreiben alles in die hosts-Datei:
$hosts_lines=array_merge($non_local_vhosts_lines, $local_vhost_lines);
if ($fp=@fopen($hosts_file, 'w')) {
fwrite($fp, implode("\n",$hosts_lines));
fclose($fp);
}
Man kann nun drauflos basteln oder sich das komplette Skript [/downloads/vhostmaker.zip] und die verwendeten Benutzerfunktionen herunterladen.
von
Carsten Witt (alias drWitt) [http://dailystar.de/]