Strohhalm

Sprung zu Navigation. Sprung zu Privat. Sprung zu StyleSwitcher. Sprung zum Inhalt.

 

Sprung zu Navigation. Sprung zu Privat. Sprung zu StyleSwitcher. Sprung zum Inhalt.

Privat

 

Anmelde-Formular



Als Strohhalm-Mitglied registrieren.

 

Sprung zu Navigation. Sprung zu Privat. Sprung zu StyleSwitcher. Sprung zum Inhalt.

Sprung zu Navigation. Sprung zu Privat. Sprung zu StyleSwitcher. Sprung zum Inhalt.

Magazin

 

strohhalm.org / Magazin / Server-Management / hosts-Datei und virtuelle Hosts synchronisieren

hosts-Datei und virtuelle Hosts synchronisieren

drwitt. Nachricht an 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 externer LinkApacheBlog [http://apacheblog.de/item/3] und externer LinkDokumentation 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?

Was tut der vhostmaker?

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.

Konfiguration

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

Verzeichnisse im vhosts-Verzeichnis einlesen

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

Windows hosts Datei einlesen

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

Die Synchronisation

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

hosts-Datei neu zusammensetzen

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

Fertig! Und jetzt?

Man kann nun drauflos basteln oder sich das komplette Skript [/downloads/vhostmaker.zip] und die verwendeten Benutzerfunktionen herunterladen.


von externer LinkCarsten Witt (alias drWitt) [http://dailystar.de/]

Diskutieren Sie mit:

 
Nach oben springen

.(c) 2002 - 2018 strohhalm.org Community.Server powered by Manitu.Software powered by Mathias Bank
.Impressum + Team.Datenschutz