Hi,
<VirtualHost *:9100>
vor allem auch beim Listen ;-)
Das ist egal, Listen 80, Listen *:80 und Listen 0.0.0.0:80 sind äquivalent (auf den SELFHTML-Servern verwenden wir zum Beispiel Listen 80, NameVirtualHost *:80 und <VirtualHost *:80>). Nur bei <VirtualHost> ist das eben nicht mehr so egal.
Hintergrund: Bei der Listen-Direktive gibt man nur an, wo das Betriebssystem lauschen soll. Die folgende Tabelle soll verdeutlichen, warum die drei beschriebenen Varianten im Endeffekt identisch sind:
Konfigurationsdatei | Apache intern | Betriebssystem
-----------------------+-------------------------+-------------------------
keine Angabe | alle Interfaces | alle Interfaces
* | alle Interfaces | alle Interfaces
0.0.0.0 | 0.0.0.0 | alle Interfaces
"keine Angabe" und "*" sind bereits auf Apache-Ebene identisch (d.h. der Apache interpretiert sie genauso). Aus 0.0.0.0 macht erst das Betriebssystem "alle Interfaces".
Was ist nun mit dem <VirtualHost>? Bei <VirtualHost> spielt es keine _direkte_ Rolle, WO der Apache nun genau lauscht, sondern wohin die konkrete Verbindung aufgebaut wurde.
Beispiel: Der Apache lauscht auf allen Interfaces, dies sei zum einen eine normale Netzwerkkarte (oder WLAN) mit 10.0.0.1 (als Beispiel jetzt mal), zum anderen natürlich localhost mit 127.0.0.1. Wenn nun eine Verbindung hereinkommt, dann fragt der Apache das Betriebssystem "Woher kommt die Verbindung?" (daher bekommt er dann die Client-IP für REMOTE_ADDR etc.) und "Wohin geht die Verbindung?" Die Antwort auf die zweite Frage scheint auf den ersten Blick trivial: "Na du selbst" - aber es ist eben ein Unterschied, ob ich http://10.0.0.1/ oder http://127.0.0.1/ in die Adresszeile eingebe. Sprich: Die konkrete (!) Verbindung spielt bei <VirtualHost> eine Rolle - soll sie ja auch, das ist ja der Witz daran. ;-)
Nun, das Betriebssystem gibt in unserem Beispiel entweder 10.0.0.1 oder 127.0.0.1 zurück, andere Möglichkeiten gibt es nicht[1]. Der Apache vergleicht dies nun mit seiner Regel für <VirtualHost>. Probieren wir aus, was passiert, wenn die drei Listen-Angabemöglichkeiten für "alles" in <VirtualHost> stehen:
- keine Angabe
-> geht schonmal gar nicht, weil <VirtualHost> primär eine IP
erwartet und keinen Port (der optional ist), während es bei Listen
genau umgekehrt ist: Ein Port wird erwartet, die IP ist optional
- *
-> funktioniert, Apache interpretiert * als "alle IPs" und dann ist
ihm egal, ob die IP nun 127.0.0.1 oder 10.0.0.1 oder sonstwas ist
- 0.0.0.0
-> funktioniert nicht, Apache interpretiert an dieser IP NICHTS mehr
herum (das hat bei Listen ja auch das Betriebssystem gemacht! Das
ist hier aber nicht mehr involviert, weil es hier ja nur die IP
der Verbindung ZURÜCKGEGEBEN hat und das war's) und deswegen schlägt
der IP-Vergleich fehl. Was passiert also? Der Default-Host wird
genommen. Und das ist genau das von Dir im Ausgangsposting
beschriebene verhalten.
Viele Grüße,
Christian
[1] Jaja, 127.0.0.1 ist eigentlich ein /8er-Netz, das unterschlage ich jetzt einmal, weil's das Verständnis nicht weiterbringt.