Apache: virtueller Host lokal und im Internet
Bertold Bernreuter
- webserver
Hallo!
Ich habe zu Testzwecken einen Apache Webserver (2.0.36/Win32) mit virtuellen Hosts eingerichtet. Wie stelle ich es nun eigentlich an, Internetzugang zur Remote-Domain www.example.tld zu erhalten, wenn ich diese Domain lokal als virtuellen Host eingerichtet habe? Rufe ich die Adresse im Browser auf, bekomme ich nur die lokale Version zu sehen. Stoppe ich Apache, erhalte ich die Fehlermeldung "Beim Versuch, www.example.tld zu kontaktieren, wurde die Verbindung zurückgesetzt."
Kann ich Apache irgendwie mitteilen, dass er mal lokal, mal im Internet suchen soll? Ich habe es mal mit "Listen 127.0.0.1:80" versucht, jedoch ohne Erfolg. Eine feste IP scheidet wahrscheinlich aus (?), da es sich bei meiner lokalen Kiste um ein Notebook handelt, das ich mal hier, mal dort ans Internet hänge.
Meine httpd.conf sieht so aus:
ServerName localhost:80
[...]
NameVirtualHost 127.0.0.1
<VirtualHost 127.0.0.1>
DocumentRoot D:/www
ServerName www.example.tld
DirectoryIndex index1.htm
</VirtualHost>
<VirtualHost 127.0.0.1>
DocumentRoot D:/sub1
ServerName sub1.example.tld
DirectoryIndex index1.htm
</VirtualHost>
Die Datei "hosts" unter windows\system32\drivers\etc hat folgendes Muster:
127.0.0.1 localhost
127.0.0.1 www.example.tld
127.0.0.1 sub1.example.tld
Ich habe zugegebenermaßen von der ganzen Materie nicht allzu viel Ahnung; kann also leicht sein, dass ich irgendwelche fundamentalen architektonischen Fehler produziert habe.
Für jede Hilfe wäre ich entsprechend sehr dankbar!
Viele Grüße
Bertold
use Mosche;
Ich habe zu Testzwecken einen Apache Webserver (2.0.36/Win32) mit virtuellen Hosts eingerichtet. Wie stelle ich es nun eigentlich an, Internetzugang zur Remote-Domain www.example.tld zu erhalten, wenn ich diese Domain lokal als virtuellen Host eingerichtet habe? Rufe ich die Adresse im Browser auf, bekomme ich nur die lokale Version zu sehen. Stoppe ich Apache, erhalte ich die Fehlermeldung "Beim Versuch, www.example.tld zu kontaktieren, wurde die Verbindung zurückgesetzt."
Hierbei geht es nur sekundär um Apache.
Dein Browser sucht eine IP für www.example.tld (u.a. auch in hosts). Wenn es die gefunden hat (127.0.0.1 == localhost), dann hört es auf zu suchen und kontaktiert diese IP an Port 80. Wenn Apache nicht läuft, findet er an Port 80 nix.
Ich empfehle dir, entweder ein Start/Stop-Script für deine Internet-Verbindung zu schreiben, welches dann je nach Zustand der Verbindung deine hosts-Datei um deine lokalen Einträge erweitert/reduziert oder (besser) lokal einfach einen anderen (unbenutzen) Namen zu verwenden.
use Tschoe qw(Matti);
Hallo Matti!
Vielen Dank für die schnelle Antwort!
Jetzt weiß ich also, wo ich weiterbasteln muss.
Ich empfehle dir, entweder ein Start/Stop-Script für deine Internet-Verbindung zu schreiben, welches dann je nach Zustand der Verbindung deine hosts-Datei um deine lokalen Einträge erweitert/reduziert oder (besser) lokal einfach einen anderen (unbenutzen) Namen zu verwenden.
Dein zweiter Lösungsvorschlag scheidet wohl aus, da die betreute Domain eben Subdomains hat, die ich lokal nachbilden muss, damit die Links hin und her funktionieren. (Oder gäb's da eventuell andere Möglichkeiten?)
Bleibt die Script-Geschichte. Oje... Hast du eventuell eine Ahnung, ob und wo man im Web so was in der Art finden könnte? Variablen anzupassen sollte ich hinbekommen, aber zum Selberschreiben fehlt's leider bei weitem.
Übrigens, noch eine andere Frage: Seit ich den Webserver installiert habe, muss ich Webseiten oft mehrfach (bis zu zehnmal oder manchmal noch öfter) aufrufen, bis der Browser sie findet, und zwar gleich, ob mit originaler oder neuer hosts-Datei. ("www.irgendwas.tld konnte nicht gefunden werden. Überprüfen Sie den Namen und versuchen Sie es nochmals.") Hast du eine Ahnung, woran das liegt und wie man das Problem umgehen könnte?
Beste Grüße
Bertold
hi,
Übrigens, noch eine andere Frage: Seit ich den Webserver installiert habe, muss ich Webseiten oft mehrfach (bis zu zehnmal oder manchmal noch öfter) aufrufen, bis der Browser sie findet, und zwar gleich, ob mit originaler oder neuer hosts-Datei. ("www.irgendwas.tld konnte nicht gefunden werden. Überprüfen Sie den Namen und versuchen Sie es nochmals.") Hast du eine Ahnung, woran das liegt und wie man das Problem umgehen könnte?
Das klingt ganz so, als ob dein lokaler Webserver auf port 80 lauscht. Dafür bekommt er zuerst deine lokale hosts-Datei zur Namensauflösung angeboten und findet dort die angeforderte Adresse nicht. Setze deinen lokalen Apache mal auf einen anderen port - höher als 1024 und gib Auskunft, ob das was gebracht hat.
Allerdings: gar so streng ist der Apache 2.0.36 noch nicht gewesen, das gibts eigentlich erst ab Apache 2.0.45 und höher - soweit mir bekannt. Eventuell solltest du überlegen, warum es denn ein Apache 2.0.36 sein muß, der doch noch bissel sehr "buggy" war.
Grüße aus Berlin
Christoph S.
Hallo Christoph!
Also, ich habe jetzt erst mal den Apache 2.0.49 drauf getan und auf Port 2000 gesetzt. Beim Versuch, meine Domain (lokal oder online) zu erreichen, kommt die Fehlermeldung "Beim Versuch, www.example.tld zu kontaktieren, wurde die Verbindung zurückgesetzt." Hat also wohl noch nichts gebracht.
Folgende Einstellungen hatte ich vorgenommen:
Listen 2000
ServerName localhost:2000
NameVirtualHost 127.0.0.1:2000
<VirtualHost 127.0.0.1:2000>
blabla
</VirtualHost>
Ich hab's auf Port 80 zurückgesetzt; jetzt funktioniert's wieder lokal, jedoch nicht online.
Beste Grüße
Bertold
hi,
Ich hab's auf Port 80 zurückgesetzt; jetzt funktioniert's wieder lokal, jedoch nicht online.
juchhu! Dann ist eigentlich alles in Ordnung *grins*
Zur Erklärung: Dein lokaler Apache rennt durch die aktuelle Weltgeschichte. Dein Browser will gerne "www.neinedomain.tld" haben und fragt als ersten deinen lokalen Apache. Der schaut zuerst in deine lokale hosts-Datei und sagt brav: "bitteschön, habe ich" und schickt deinem Browser die lokal gespeicherten Seiten. Weitere Abfragen im Internet hält er nicht für nötig.
Genau diese - übrigens wirklich völlig korrekte - Verhaltensweise zeigt Apache erst ab Version 2.0.45 (unter Windows). Dein Browser ist mit dem Ergebnis auch zufrieden, er hat ja auf seine Server-Anfrage hin eine befriedigende Antwort erhalten und sieht keinen Grund, etwa noch andere Server im Internet zu fragen, ob sie ihm vielleicht unter dieser Adresse was schicken könnten.
Der Grund: "www.meinedomain.tld" gibt es in identischer Form und Schreibweise sowohl im Internet bei deinem Provider wie auch lokal als virtuellen host und in deiner hosts-Datei lokal (mit einer "privaten" IP). Dein Browser fragt nun _zuerst_ den lokalen Apache, und der fragt _zuerst_ deine hosts-Datei, danach halten Browser und Server die Angelegenheit für erledigt, weil es ja ein anzeigbares Ergebnis gegeben hat.
Abhilfe: der Eintrag "servername.tld" in deiner hosts-Datei darf nicht identisch sein mit einer im Internet vorhandenen Adresse "servername.tld".
Oder habe ich dein Problem komplett mißverstanden? Hast du das Problem denn auch noch, wenn du deinen lokalen Apache mal komplett ausschaltest?
Grüße aus Berlin
Christoph S.
Hallo Christop!
Genau diese - übrigens wirklich völlig korrekte - Verhaltensweise zeigt Apache erst ab Version 2.0.45 (unter Windows).
Der 2.0.36 war übrigens auch schon so brav und hat das Gleiche gemacht.
Oder habe ich dein Problem komplett mißverstanden?
Naja, ein wenig schon.
Ich habe eine Domain mit Subdomains zu betreuen. Damit Links der Art von "http://sub1.example.tld" nach "http://sub2.example.tld" auch lokal funktionieren, habe ich den Webserver aufgesetzt. Die Adressen lokal und online sind also identisch. Vielleicht könnte man hier ansetzen und die Adressen lokal irgendwie automatich verändern, etwa als "http://localhost/sub1.example.tld". Keine Ahnung, ob und wie man so etwas bewerkstelligen könnte. Dann wäre das Problem erst einmal gelöst.
Hast du das Problem denn auch noch, wenn du deinen lokalen Apache mal komplett ausschaltest?
Dazu sollte ich vielleicht erst einmal fragen, wie man das macht. Meinst du die Funktion "Stop" im Apache-Kontrollmenü oder etwas Fundamentaleres? Falls "Stop", dann ist das Ergebnis (wie beschrieben), dass ich meine Domain weder lokal noch online erreichen kann. (Die Erklärung dazu hat ja Matti geliefert.) Übrigens lässt sich das Ding nur im Administrator-Modus stoppen oder starten. Ist das normal?
Es bleibt aber in jedem Fall das nervige Verhalten des Browser, Webseiten meist erst nach mehrfachen Klicken zu öffnen. Das macht er erst, seitdem ich den Apache installiert habe. Kennst du dieses Verhalten? (Aber das ist ein zweites und im Moment nachgeordnetes Problem.)
Beste Grüße
Bertold
Moin!
Zur Erklärung: Dein lokaler Apache rennt durch die aktuelle Weltgeschichte. Dein Browser will gerne "www.neinedomain.tld" haben und fragt als ersten deinen lokalen Apache. Der schaut zuerst in deine lokale hosts-Datei und sagt brav: "bitteschön, habe ich" und schickt deinem Browser die lokal gespeicherten Seiten. Weitere Abfragen im Internet hält er nicht für nötig.
CHRISTOPH! Kann doch nicht wahrsein! Oder bist du wieder ein Fake, der die Sachkenntnis des echten Christoph in Zweifel ziehen will?
Die Abfolge ist jedenfalls falsch geschildert.
Der Browser soll Kontakt zu www.example.com aufnehmen. Dazu fragt er beim Betriebssystem nach dessen IP-Adresse. Das Betriebssystem hat (bei manchen Systemen konfigurierbar) sowohl die Domainlistendatei "hosts", als auch die Nameserver im Internet als Informationsquelle.
Standardverhalten: Zuerst in die Datei "hosts" gucken. Wenn dort die gewünschte Domain mit IP aufgeführt ist, diese zurückmelden. Ansonsten: Nameserver befragen.
Da die IP in hosts enthalten ist, wird die IP der lokalen Installation zurückgegeben, und der Browser verbindet sich jetzt auf Port 80 dieser IP, um eine Webseite zu kriegen.
Und erst dann wird der lokale Apache aktiv und liefert die entsprechende Seite der angeforderten Domain aus. Er schaut aber ausdrücklich _NICHT_, ob im Internet irgendwelche Server auf den gleichen Namen hören würden. Das ist (außer man konfiguriert sich einen Proxy) absolut nicht seine Aufgabe.
Genau diese - übrigens wirklich völlig korrekte - Verhaltensweise zeigt Apache erst ab Version 2.0.45 (unter Windows). Dein Browser ist mit dem Ergebnis auch zufrieden, er hat ja auf seine Server-Anfrage hin eine befriedigende Antwort erhalten und sieht keinen Grund, etwa noch andere Server im Internet zu fragen, ob sie ihm vielleicht unter dieser Adresse was schicken könnten.
Wie gesagt: Der Grund für die Anfrage am lokalen Webserver liegt begründet in dem Ergebnis der Namensauflösung - nicht jedoch an der Webserverinstallation.
Der Grund: "www.meinedomain.tld" gibt es in identischer Form und Schreibweise sowohl im Internet bei deinem Provider wie auch lokal als virtuellen host und in deiner hosts-Datei lokal (mit einer "privaten" IP). Dein Browser fragt nun _zuerst_ den lokalen Apache, und der fragt _zuerst_ deine hosts-Datei, danach halten Browser und Server die Angelegenheit für erledigt, weil es ja ein anzeigbares Ergebnis gegeben hat.
Der Server ist unbeteiligt.
Abhilfe: der Eintrag "servername.tld" in deiner hosts-Datei darf nicht identisch sein mit einer im Internet vorhandenen Adresse "servername.tld".
Wenigstens das stimmt.
Zur Info: Es gibt die extra für Testzwecke definierte Top-Level-Domain "test", die im Internet garantiert nicht benutzt wird.
Also kann man für den lokalen Testserver "www.domain.test" benutzen, und für den Liveserver dann "www.domain.com/de/org/net/wasauchimmer".
Der Nachteil: Selbstverständlich ist es bei dieser Lösung unmöglich, hartcodierte Domainnamen in die Skripte zu packen, so dass dadurch sowohl auf dem Test- als auch Liveserver das Skript auf die identische Domain reagiert.
Andererseits: Wenn sich die Domain des Liveservers irgendwann mal ändert, hätte man ja auch das Problem, dass man in den Skripten die Domains ändern müßte.
Deshalb: Die Domain des aktuell benutzten virtuellen Hosts steht in $_SERVER['HTTP_HOST'] drin und darf auch verwendet werden. :)
Oder habe ich dein Problem komplett mißverstanden? Hast du das Problem denn auch noch, wenn du deinen lokalen Apache mal komplett ausschaltest?
Das Abschalten wird nichts bringen, weil der Browser dann immer noch die falsche IP-Adresse nach Webseiten befragen wird. Der Apache hat mit der DNS-Namensauflösung nicht das geringste zu tun - auch in der Windows-Version nicht. Mag sein, dass du das irgendwie mit dem IIS verwechselst, der ja nicht nur Webserver sein kann (aber ob der DNS kann, würde ich einfach mal bezweifeln).
- Sven Rautenberg