Apache - VirtualHosts funktionieren nicht
Jonas
- webserver
Hey :-)
Ich habe gestern in meinem vServer (läuft unter Windows) den IIS deaktiviert und Apache installiert. Nicht etwa, weil ich der Meinung wäre, das wäre nun eine sichere Lösung, aber die Ressourcen sind begrenzt, ich erhoffe mir dass Apache etwas sparender damit umgeht.
Zum Thema: Ich hab 2 Domains über die IP laufen. Jede soll natürlich ihre eigenen Dateien beinhalten, in einem eigenen Verzeichnis.
Ich bin nach dieser Anleitung vorgegangen:
http://barrierefrei.e-workers.de/know_virtual.php
Habe aber auch die Anleitung von SelfHTML offen gehabt. Folgendes hab ich jetzt getan:
Meine Hosts-Datei erweitert:
127.0.0.1 www.webchat-solutions.de
127.0.0.1 www.intalk.de
Die httpd.conf erweitert:
NameVirtualHost 127.0.0.1
<VirtualHost 127.0.0.1>
ServerName localhost
ServerAlias 127.0.0.1
DocumentRoot "C:/Web/WebPages/WebChatSolutions"
ErrorLog "C:/Web/WebPages/WebChatSolutions\logs\error.log"
TransferLog "C:/Web/WebPages/WebChatSolutions\logs\access.log"
ScriptAlias /cgi-bin/ "C:/Web/Software/Apache/cgi-bin/"
</VirtualHost>
<VirtualHost 127.0.0.1>
ServerName inTalk.de
ServerAlias 127.0.0.1
DocumentRoot "C:/Web/WebPages/InTalk"
ErrorLog "C:/Web/WebPages/InTalk/logs/error.log"
TransferLog "C:/Web/WebPages/InTalk/logs/access.log"
</VirtualHost>
Und dieses Modul hier war auskommentiert, das hab ich aktiviert:.
LoadModule vhost_alias_module modules/mod_vhost_alias.so
Es funktioniert nicht aber nicht. Egal ob man auf www.intalk.de oder auf www.webchat-solutions.de geht, man landet immer im normalen DocumentRoot, statt in dem für VirtualHost vorgesehenen DocumentRoot.
Hab ich was übersehen?
Lg
Jonas
Mahlzeit,
Meine Hosts-Datei erweitert:
127.0.0.1 www.webchat-solutions.de
127.0.0.1 www.intalk.de
[...]
NameVirtualHost 127.0.0.1
<VirtualHost 127.0.0.1>
ServerName inTalk.de
[...]
</VirtualHost>
[...]
Es funktioniert nicht aber nicht. Egal ob man auf www.intalk.de oder auf www.webchat-solutions.de geht, man landet immer im normalen DocumentRoot, statt in dem für VirtualHost vorgesehenen DocumentRoot.
Und du bist dir ganz sicher, dass sowohl webchat-solutions.de als auch intalk.de nach 127.0.0.1 auflösen? Apache benutzt nämlich nur die Einstellungen des entsprechenden <VirtualHost>-Containers, wenn eine Anfrage an die IP 127.0.0.1 unter Angabe des Servernamens "intalk.de" eingeht.
MfG,
EKKi
Und du bist dir ganz sicher, dass sowohl webchat-solutions.de als auch intalk.de nach 127.0.0.1 auflösen? Apache benutzt nämlich nur die Einstellungen des entsprechenden <VirtualHost>-Containers, wenn eine Anfrage an die IP 127.0.0.1 unter Angabe des Servernamens "intalk.de" eingeht.
Hm kann man das irgendwo nachsehen?
Lg
Jonas
Mahlzeit,
Hm kann man das irgendwo nachsehen?
"nslookup intalk.de" in der Shell deiner Wahl ...
MfG,
EKKi
Mahlzeit,
Hm kann man das irgendwo nachsehen?
"nslookup intalk.de" in der Shell deiner Wahl ...
Achsooo ja, da musste die richtige IP rein, unter ich extern zu erreichen bin.
Nun klappts :D Danke! ;)
Lg
Jonas
Hi Jonas,
Meine Hosts-Datei erweitert:
127.0.0.1 www.webchat-solutions.de
127.0.0.1 www.intalk.de
Wie EKKi dir bereits gesagt hat, bist du mit interner und externer IP durcheinander gekommen. Diese Einträge in der hosts-Datei hier braucht man eigentlich nur, wenn man auf der Maschine lokal entwickelt und keinen DNS-Eintrag auf die Maschine zeigen hat ;-)
Du kannst die Einträge aber auch gerne drinlassen… Wenn nun z.B. ein PHP-Script eine MySQL-Verbindung zu „www.webchat-solutions.de” öffnet, so muss dein Server keine DNS-Abfrage starten und kann die IP direkt aus der Hosts-Datei nehmen.
NameVirtualHost 127.0.0.1
<VirtualHost 127.0.0.1>
Du könntest dir hier das Leben auch einfacher machen, indem du
~~~apache
NameVirtualHost *
<VirtualHost *:80>
schreibst - du nutzt ja sowieso ausschließlich namensbasierte VirtualHosts.
> ServerName localhost
> ServerAlias 127.0.0.1
Wenn du „www.webchat-solutions.de” im Browser eintippst, so landest du bei diesem VirtualHost, richtig? Das ist aber nur Zufall ;-)
Der Apache hat einen Fallback-Mechanismus eingebaut. Wenn ein Virtueller Host nicht gefunden wird, dann bedient der Apache den Request mit dem <VirtualHost \_default\_:80>, sofern dieser vorhanden ist, andernfalls mit dem \*ersten VirtualHost\*, den er in der Konfiguration findet.
Es wäre also schöner, wenn du hier wie folgts konfigurierst:
~~~apache
ServerName webchat-solutions.de
ServerAlias www.webchat-solutions.de
# Alternativ auch so:
#ServerName *.webchat-solutions.de
Damit fühlt sich dieser VirtualHost zuständig für Anfragen auf webchat-solutions.de, www.webchat-solutions.de oder alternativ auf <irgendwas>.webchat-solutions.de.
ServerName inTalk.de
ServerAlias 127.0.0.1
Hast du schon mal „www.intalk.de” in deinen Browser eingegeben? Eigentlich dürftest du da keine Website zu sehen bekommen, bzw. maximal deine „webchat-solutions.de” Seite. Du hast nämlich „www.intalk.de” nicht als ServerAlias definiert:
~~~apache
ServerName intalk.de
ServerAlias www.intalk.de
> Und dieses Modul hier war auskommentiert, das hab ich aktiviert:.
> LoadModule vhost\_alias\_module modules/mod\_vhost\_alias.so
Das Modul [mod_vhost_alias](http://httpd.apache.org/docs/2.2/mod/mod_vhost_alias.html) ist, wie du der entsprechenden Apache-Doku entnehmen kannst für Massen-VirtualHosts zuständig. Dieses Modul bietet dir die Möglichkeit Domains zu bedienen, ohne dafür explizit in der Konfiguration einen VirtualHost hinterlegen zu müssen. Du definierst einfach ein Verzeichnis und der Apache sucht darin nach einem Ordner, dessen Name der Domain entspricht.
Vorteil dieses Moduls ist, dass man für das Einrichten neuer VirtualHosts den Apache nicht immer neustarten muss. Nachteil ist, dass du natürlich keine saubere und für jeden VirtualHost individuelle Konfiguration hast.
Kurz um, du brauchst dieses Modul nicht ;-) Schmeiß es also aus der Konfiguration raus, wenn du die benötigten Ressourcen minimieren willst.
> Es funktioniert nicht aber nicht. Egal ob man auf www.intalk.de oder auf www.webchat-solutions.de geht, man landet immer im normalen DocumentRoot, statt in dem für VirtualHost vorgesehenen DocumentRoot.
Wenn du deinen Server jetzt noch „schön” konfigurieren willst, dann legst du noch folgenden VirtualHost an:
~~~apache
<VirtualHost _default_:80>
# Für den Default-VirtualHost ist der ServerName nicht allzu wichtig
ServerName localhost
# Die Konfigurationen für die Pfade… Bitte hierbei beachten, dass du
# in einer Angabe nicht Forward- und Backward-Slash mixt (/ und \).
DocumentRoot "C:/Web/WebPages/Default/htdocs"
ErrorLog "C:/Web/WebPages/Default/logs/error.log"
TransferLog "C:/Web/WebPages/Default/logs/access.log"
ScriptAlias /cgi-bin/ "C:/Web/WebPages/Default/cgi-bin/"
# Alle Aufrufe auf die index.html umleiten (hierfür wird
# [link:http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html@title=mod_rewrite] benötigt!)
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/index.html$
RewriteRule .* /index.html
</VirtualHost>
In diese index.html schreibst du dann einfach etwas rein wie „Die angeforderte Domain konnte auf unserem Server leider nicht gefunden werden.” und schon zeigt dein Server direkt noch eine verständliche Fehlerseite an, wenn mal ein DNS-Eintrag falsch gesetzt ist und jemand irgendwie mit einer unbekannten Domain auf deinem Server landet (eine Domain, für welche kein VirtualHost definiert ist).
Vielleicht fällt dir auf, dass ich in der Konfiguration für den Default-Host auch die Pfade noch etwas geändert habe. Es ist üblich, dass man für jeden VirtualHost einen eigenen Ordner anlegt (hast du bereits gemacht) und darin einen Ordner htdocs für alle öffentlichen Dokumente, einen Ordner cgi-bin und einen Ordner logs.
Du hingegen hattest den DocumentRoot direkt auf den Ordner für die Domain gelegt, was den Nachteil hat, dass man über example.com/logs/error.log auf dein Logfile zugreifen kann - dies ist nicht gerade besonder schön ;-)
Viele Grüße,
~ Dennis.