Apache Standard / Catch-All Virtual Host?

67

Wenn ich 3 Domänen habe, domain1.com, domain2.com und domain3.com, ist es möglich, einen virtuellen Standardhost für nicht aufgelistete Domänen einzurichten? Zum Beispiel, wenn ich hätte:

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain1
ServerName domain1
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain2
ServerName domain2
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/everythingelse
ServerName *
ServerAlias host
</VirtualHost>

Wenn Sie eine Domain registrieren und auf meinen Server verweisen, wird standardmäßig alles andere als domain3 angezeigt. Ist das möglich?

SJaguar13
quelle

Antworten:

45

Ja, das sollte funktionieren, außer dass ServerAlias ​​"*" sein sollte, wobei ServerName auf einen tatsächlichen Hostnamen gesetzt ist. Möglicherweise müssen Sie sicherstellen, dass VirtualHost das zuletzt geladene ist ...

freiheit
quelle
Es sollte funktionieren, tut es aber nicht. Wenn eine Domain nicht speziell aufgeführt ist, erhalte ich die Meldung "Firefox kann den Server nicht finden".
SJaguar13,
2
Haben Sie es als "ServerName Host" und "ServerAlias ​​*" festgelegt? Ich habe dies ursprünglich nicht genug betont, aber ServerName akzeptiert keine Platzhalter, nur ServerAlias. Servername muss ein tatsächlicher Hostname sein.
freiheit
Funktionieren auch die anderen virtuellen Hosts? Welche Version von Apache?
freiheit
"Firefox kann den Server nicht finden." ist kein Apache-Problem. Sie benötigen weitere Informationen (welcher Server wird kontaktiert, welcher Fehlercode ...)
Law29
Komisch, dass das bei mir nicht funktioniert, es wählt immer den ersten virtuellen Host aus, unabhängig vom Host-Header
jjxtra
80

Wenn Sie namensbasierte virtuelle Hosts verwenden, wird standardmäßig die erste virtuelle Host-Konfiguration geladen (Quelle: Apache Wiki ). In der folgenden Konfiguration stimmen beispielsweise nicht übereinstimmende Domänen überein mit domain-one.com:

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName domain-one.com
  # Other options and directives ..
</VirtualHost>

<VirtualHost *:80>
  ServerName domain-two.com
  # Other options and directives ..
</VirtualHost>

Viele Server haben keine monolithische Konfigurationsdatei, sondern mehrere hostspezifische Konfigurationsdateien, die wie folgt organisiert sind:

/etc/apache2
|-- sites_available  (actual configuration files)
`-- sites_enabled    (symlinks to files in sites_available)

Um in diesem Fall eine bestimmte Konfiguration des virtuellen Hosts zuerst zu laden, benennen Sie den Symlink in etwas um, das beim Sortieren zuerst angezeigt wird, z 00-default.


Einige der anderen Antworten sind nicht ganz richtig. Laut dem Apache-Wiki ist es falsch, in einem virtuellen Host keinServerName einzurichten. Wenn der Host ohne a ServerNamenicht zuerst geladen wird, wird er möglicherweise von Apache nicht einmal verwendet, da der zuerst geladene Host der Standard ist.

Darüber hinaus ServerAlias *werden zwar alle Übereinstimmungen berücksichtigt, es können jedoch auch andere später definierte virtuelle Hosts außer Kraft gesetzt werden. Möglicherweise funktioniert dieser Ansatz, wenn immer der letzte virtuelle Host definiert wird (wie in der in der Frage angegebenen Konfiguration). Dies bedeutet jedoch, dass eine neue Direktive hinzugefügt und die Sortierreihenfolge geändert wird, anstatt nur die Reihenfolge wie oben zu ändern.

Jason Blevins
quelle
+ 1 Million Internets an Sie, Sir! Es muss zuerst sein, um Standard zu sein.
Ryan
Wissen Sie, welches zuerst kommt, httpd.conf oder conf.d / xyz.conf?
Esa Varemo
2
"Die erste geladene virtuelle Host-Konfiguration ist die Standardkonfiguration" löste mein Problem mit lokalen SSL-Domänen unter XAMPP (Windows). Es sieht so aus, als ob Apache first vhost als Standard für jeden Port verwendet. Um also nicht übereinstimmende Domains für beide ungesicherten / gesicherten Anfragen richtig zu behandeln, sollten zu Beginn vonhttpd-vhosts.conf
Wirone
1
@EsaVaremo - httpd.conf wird zuerst geladen und enthält eine Include-Zeile, die conf.d / xyz.conf (oder wahrscheinlich conf.d / *) enthält. Jede Konfiguration (einschließlich vhosts) vor der Include-Zeile wird zuerst verarbeitet. Alles, was nach der Include-Zeile steht, wird nach den eingeschlossenen Dateien verarbeitet.
Dan Pritts
7

Geben Sie keinen Servernamen an, und das wird Ihr vhost-Standard.

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
</VirtualHost> 

Stellen Sie außerdem sicher, dass Sie in der httpd.conf-Hauptdatei kein DocumentRoot angegeben haben, da dies Vorrang vor den vhosts hat.

Vid Luther
quelle
Ich habe das als ersten virtuellen Host aufgelistet und erhalte immer noch die Meldung "Firefox kann den Server nicht finden".
SJaguar13
2
Ich stimme dir nicht zu. Ich habe meinen ersten virtuellen Host ohne einen Servernamen eingerichtet. Es scheint jedoch einen Konflikt mit einigen virtuellen Hosts zu geben, andere jedoch nicht. Ich habe das Problem durch Hinzufügen eines Servernamens behoben, ihn jedoch auf eine zufällige Domäne festgelegt, die sich nicht auf meinem Server befindet. Da es der erste virtuelle Host ist, wird er als Standard verwendet, aber nur, wenn eine Domäne verwendet wird, die keinem anderen Servernamen entspricht.
Joshaidan
3

Reihenfolge ist wichtig - Verschieben Sie Ihre vhost-Definition für alles andere an den Anfang der Liste.


quelle
2

Verwenden Sie den virtuellen Host _default_ und platzieren Sie ihn zuerst in httpd-vhosts.conf, wie in http://httpd.apache.org/docs/2.2/vhosts/examples.html angegeben

"Abfangen jeder Anforderung an eine nicht spezifizierte IP - Adresse und einen Port, dh eine Adresse / Port - Kombination, die für keinen anderen virtuellen Host verwendet wird. [...] Ein Standard - vhost dient niemals einer Anforderung, die an eine Adresse / einen Port gesendet wurde Wird für namensbasierte vhosts verwendet. Wenn die Anforderung einen unbekannten oder keinen Host: -Header enthielt, wird sie immer vom primären namensbasierten vhost (dem vhost für diese Adresse / diesen Port, der in der Konfigurationsdatei zuerst angezeigt wird) bereitgestellt. "

Snippet aus einer lebenden, aber verschleierten httpd-vhosts.conf, die zufällig alle vhosts auf Port 80 sperrt:

# Listen for virtual host requests on all IP addresses.
# This directive cannot be removed:
NameVirtualHost *:80

<VirtualHost _default_:80>
# This vhost catches client requests with host headers which have
# not been matched by ServerName or ServerAlias directives in other vhosts.
#
# We redirect all such requests to a particular named vhost:
    RewriteCond %{HTTP_HOST}    ^(.*)$
    RewriteRule ^(.*)$  http://my.site.of.choice [R=permanent,L]
</VirtualHost>

# Name based vhosts here:
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  my.other.site
    ServerAlias my.other.site2 my.other.site3
</VirtualHost>

# more vhosts etc...

Eine ausführliche Erläuterung des vhost-Abgleichs finden Sie hier: http://httpd.apache.org/docs/2.2/vhosts/details.html

ErikE
quelle
2
_default_wird nur für nicht übereinstimmende IPs verwendet . Wenn Sie also einen vhost-Platzhalter (*: 80) haben, wird dieser niemals verwendet.
Wirone
2

Platzhalter enthalten Ihre Site-Konfigurationsdateien:

Include path/to/site/confs/*httpd.conf

Organisieren Sie die Conf-Dateien Ihrer Site so, dass sie in der erwarteten Reihenfolge geladen werden. Beispiel...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

usw...

Apache liest diese der Reihe nach. Erstellen Sie dann einen, der immer zuletzt geladen wird, um nicht angepasste virtuelle Hosts abzufangen und einen 404-Wert zurückzugeben, anstatt eine Standardwebsite zu laden.

99-catchall-httpd.conf

<VirtualHost *:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost *:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Stellen Sie sicher, dass Sie die Ports durch die Ports ersetzen, an denen Ihr httpd empfangsbereit ist. Wenn Sie bestimmte Schnittstellen mit httpd überwachen, müssen Sie stattdessen für jede Schnittstelle einen Catchall hinzufügen, wie folgt:

<VirtualHost 192.168.1.101:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>
<VirtualHost 192.168.1.101:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Hoffe das hilft. Ich verwende diese Methode, um Websites in der angegebenen Reihenfolge zu laden und zu verhindern, dass nicht angepasste virtuelle Hosts eine unerwartete Website unbeabsichtigt laden.

Jason Slobotski
quelle
1

Die beste Lösung ist, die Site-Konfigurationsdatei mit einer "1" umzubenennen, damit sie zuerst geladen wird und dies Ihre Standard-Site ist.

Apache2 legt die erste geladene vhost-Datei als Standardseite fest.

xoompa
quelle
Die Standard-Apache-Installation hat 000-defaultaus diesem Grund auch einen virtuellen Host.
vp_arth
0

Wenn Sie <VirtualHost *:port>ServerName / ServerAlias ​​für die Hosts verwenden und angeben, die Ihnen am Herzen liegen, musste ich dies tun.

Ein bisschen Hintergrund in meiner Situation:

Ich habe eine dynamische IP-Adresse von meinem ISP, sodass meine IP-Adresse bei einem Unternehmen registriert ist, das dynamische IP-Adressen registriert (in meinem Fall noip.org). Einer meiner "Hosts" musste bei meiner DNS-Registrierung als myabc.example.com als CNAME registriert sein, der auf host1.ddns.net verweist. Aber host2.ddns.net wurde so belassen wie es ist. Ich wollte, dass myabc.example.com und host1.ddns.net zu site1 und host2.ddns.net zu site 2 und alles andere, einschließlich meiner IP-Adresse, zu default gehen.

Die erste conf - Datei gelesen wird der Standard sein, das heißt 000_def.conf, 001_site1.conf, 002_site2.confwird in dieser Reihenfolge gelesen werden 000_def.confals Standard - Website. (Anmerkung: in meinem Fall habe ich diese "Dateien", in /etc/apache2/sites-enableddenen sich tatsächlich dynamische Links zur eigentlichen conf-Datei befinden /etc/apache2/sites-available)

Da der Servername in 001_site1.conf und 002_site2.conf verwendet wird, muss er auch in 000_def.conf auf einen Wert gesetzt werden.

# 000_def.conf:
<VirtualHost *:80>  
ServerName null
# NOTE: DO NOT USE "ServerAlias *" this seems to override the other conf files.
</VirtualHost>


# 001_site1.conf
<VirtualHost *:80>  
ServerName myabc.example.com
ServerAlias mylocalhostname host1.ddns.net
</VirtualHost>


# 002_site2.conf:
<VirtualHost *:80>  
ServerName host2.ddns.net
</VirtualHost>
Alan
quelle