Apache Named VirtualHosts mit Platzhaltern

7

Ich möchte www.example.com einem bestimmten virtuellen Host zuordnen und dann möchte ich, dass alle anderen Subdomains von example.com zu einem anderen virtuellen Host wechseln.

Dazu habe ich folgende Hosts erstellt:

<VirtualHost *:80>
  ServerName www.example.com
</VirtualHost>

<VirtualHost *:80>
  ServerName example.com
  ServerAlias *.example.com
</VirtualHost>

Nun scheint die Auswahl, welcher Host bedient wird, eher zufällig zu sein. Wenn ich Apache manchmal neu starte, bekomme ich manchmal einen Host und ein anderes Mal einen anderen.

Was mache ich falsch?

Vielen Dank!

Update: Wenn ich apache2ctl -S in dieser Konfiguration ausführe, erhalte ich folgende Ausgabe:

VirtualHost-Konfiguration:
Platzhalter NameVirtualHosts und _default_ Server:
*: 80 ist ein NameVirtualHost
         Standardserver www.example.com (/ etc / apache2 / sites-enabled / dev: 3)
         Port 80 namevhost www.example.com (/ etc / apache2 / sites-enabled / dev: 3)
         Port 80 namevhost example.com (/ etc / apache2 / sites-enabled / dev: 22)

Nachdem ich viel herumgegraben hatte, entschied ich mich, die Mono-Anwendungen zu deaktivieren, die ich ausgeführt hatte, und siehe da, es wurden Dateien von der richtigen Site bereitgestellt. Sie mussten in der Reihenfolge eingegeben werden:

<VirtualHost *:80>
  ServerName example.com
</VirtualHost>

<VirtualHost *:80>
  ServerName www.example.com
</VirtualHost>

wie vom Assistenten vorgeschlagen. Damit meine Mono-Apps funktionieren, habe ich in jedem virtuellen Host "MonoAutoApplication enabled" verwendet. Ich bin mir jedoch nicht sicher, ob dies die beste Option ist, da auf der Mono-Site angegeben ist , dass Sie kein automatisches Hosting für asp.net mvc-Apps verwenden sollten (was ich verwende). Bisher kann ich den Nachteil allerdings nicht erkennen.

Derek Ekins
quelle

Antworten:

3

Update: * ist eine gültige Syntax, aber nicht erforderlich. Mehr erfahren Sie hier .

Dies wird jedoch funktionieren.

<VirtualHost *:80>
   ServerName example.com
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
</VirtualHost>

Die erste Direktive entspricht allem, was an anderer Stelle nicht explizit definiert ist.

Reconbot
quelle
* ist in Ordnung - ServerAlias ​​kann Platzhalter akzeptieren. httpd.apache.org/docs/2.2/mod/core.html#serveralias Obwohl die Konfiguration, die Sie haben, möglicherweise die beste Lösung ist, wenn derselbe Server keine anderen Domainnamen hostet.
David Z
Ich habe diese Konfiguration ausprobiert und alle Anfragen gingen an example.com. Dies ist die Ausgabe der apache2ctl -S <pre> VirtualHost-Konfiguration: Platzhalter NameVirtualHosts und Standardserver : *: 80 ist ein NameVirtualHost-Standardserver example.com (/ etc / apache2 / sites-enabled / dev: 3) Port 80 namevhost-Beispiel. com (/ etc / apache2 / sites-enabled / dev: 3) Port 80 namevhost www.example.com (/ etc / apache2 / sites-enabled / dev: 24) </ pre>
Derek Ekins
* ist eine vollkommen gültige Syntax.
Ceejayoz
Sie haben Recht mit dem *, ich habe es behoben - dies ist meine bisher niedrigste akzeptierte Antwort
Reconbot
Das Hinzufügen der Einträge in dieser Reihenfolge hat den Trick getan - zusammen mit der Änderung der Art und Weise, wie mod_mono konfiguriert wurde. Ich würde dich abstimmen, aber ich habe keinen Repräsentanten!
Derek Ekins
5

Der Code sollte wahrscheinlich sein:

<VirtualHost _default_:80>
   ServerName example.com
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
</VirtualHost>

Sehen: http://httpd.apache.org/docs/2.2/vhosts/examples.html#default

Dies definiert den vhost "example.com" explizit als den zu verwendenden Host, wenn nichts anderes übereinstimmt.

sysadmin1138
quelle
4

Sind Sie sicher, dass der www.example.comvhost in der Konfigurationsdatei vor dem anderen vhost angezeigt wird? Apache soll die virtuellen Hosts der Reihe nach durchsuchen und den ersten mit einem ServerNameoder auswählen, der ServerAliasdem im HostHTTP-Header gesendeten Wert entspricht . Es scheint sehr seltsam, dass manchmal ein virtueller Host und manchmal der andere zufällig ausgewählt wird.

Es kann hilfreich sein, Ihre Frage so zu bearbeiten, dass sie die Ausgabe von enthält

apache2ctl -S

Hier werden die definierten virtuellen Hosts so angezeigt, wie Apache sie sieht.

David Z.
quelle
Das ist wirklich cool - das hatte ich komplett vergessen.
Reconbot
1

Sie müssen den DocumentRoot zur Konfiguration hinzufügen. Es sollte ungefähr so ​​sein:

# Ensure that Apache listens on port 80
Listen 80

# Listen for virtual host requests on all IP addresses
NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot /www/example1
ServerName www.example1.com

# Other directives here

</VirtualHost>

<VirtualHost *:80>
DocumentRoot /www/example2
ServerName www.example2.org

# Other directives here

</VirtualHost>

EDIT: Scheint, als hätte ich mehr über Apache gewusst als ich. Danke für die Kommentare.

Joshua Nurczyk
quelle
Ich denke, das OP würde andere Symptome haben, wenn das Problem ein fehlender DocumentRoot wäre (Apache warnt vor solchen Dingen beim Start, IIRC)
David Z
Ja, ich dachte, sie würden nichts bewirken, die Seite wird tatsächlich geladen und funktioniert einwandfrei, wenn es um die richtige geht!
Derek Ekins