Frage Apache Standard / Catch-All Virtueller Host?


Wenn ich 3 Domains, domain1.com, domain2.com und domain3.com habe, ist es möglich, einen standardmäßigen virtuellen Host für Domains einzurichten, die nicht aufgelistet sind? 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 jede Domain angezeigt, die mit Domain3 identisch ist. Ist das möglich?


65
2017-11-06 18:36


Ursprung




Antworten:


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


44
2017-11-06 18:40



Es sollte funktionieren, aber nicht. Wenn eine Domain nicht speziell aufgeführt ist, bekomme ich "Firefox kann den Server nicht finden." - SJaguar13
Hast du es als "ServerName host" und "ServerAlias ​​*" eingestellt? Ich habe das ursprünglich nicht genug betont, aber ServerName nimmt keine Wildcards, nur ServerAlias ​​tut es. ServerName muss ein tatsächlicher Hostname sein. - freiheit
Funktionieren die anderen virtuellen Hosts auch? Welche Version von Apache? - freiheit
"Firefox kann den Server nicht finden." ist kein Apache Problem. Sie benötigen mehr Details (welcher Server wird kontaktiert, was ist der Fehlercode ...) - Law29


Bei Verwendung von namensbasierten virtuellen Hosts der erste virtuelle Host Die geladene Konfiguration ist der Standard (Quelle: Apache Wiki). Zum Beispiel, mit der Konfiguration unten, sonst unübertroffene Domains wird mit übereinstimmen 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, haben aber mehrere hostspezifische Konfigurationsdateien, die wie folgt organisiert sind:

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

In diesem Fall, um eine bestimmte virtuelle Hostkonfiguration zu laden Benennen Sie zuerst den Symlink in etwas um, das zuerst angezeigt wird sortiert, wie z 00-default.


Einige der anderen Antworten sind nicht ganz korrekt. Laut Apache Wiki, nicht einstellen a ServerName in einem virtuellen Host ist falsch. Wenn der Host ohne a ServerName wird nicht zuerst geladen, Apache darf es nie benutzen, da der erste geladene Host wäre der Standard.

Außerdem, während ServerAlias * wird in der Tat alles zusammenpassen, mag es sein überschreiben Sie auch andere virtuelle Hosts, die später definiert werden. Vielleicht dieser Ansatz würde funktionieren, wenn es immer das ist zuletzt virtueller Host, der definiert werden soll (wie in die Konfiguration in der Frage gegeben), aber das bedeutet, ein neues hinzufügen Richtlinie und Ändern der Sortierreihenfolge statt nur Ändern der Bestellung wie oben.


76
2018-03-26 23:06



+ 1 Million Internets für Sie, Sir! Es muss zuerst Standard sein. - Ryan
Weißt du, welcher zuerst kommt, httpd.conf oder conf.d / xyz.conf? - Esa Varemo
+ 2 Millionen Internets, danke Sir. - Ben Everard
"Die erste geladene virtuelle Host-Konfiguration ist der Standard" löste mein Problem mit lokalen SSL-Domänen auf XAMPP (Windows). Es sieht so aus, als ob Apache den ersten vhost als Standardeinstellungen für jeden Port verwendet. Um also nicht übereinstimmende Domains für ungesicherte / gesicherte Anfragen richtig zu behandeln, sollten zwei explizite "Standard" -Konfigurationen für 80/443 Ports definiert sein httpd-vhosts.conf - Wirone
@EsaVaremo - httpd.conf wird zuerst geladen, und es wird eine Include-Zeile enthalten, die conf.d / xyz.conf (oder wahrscheinlich, conf.d / *) enthält. Jede Konfiguration (einschließlich vhosts) vor der Include-Zeile wird zuerst verarbeitet; alles nach der Include-Zeile wird nach den enthaltenen Dateien verarbeitet. - Dan Pritts


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

<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 Hauptdatei httpd.conf kein DocumentRoot angegeben haben, da dies Vorrang vor den Vhosts hat.


7
2017-11-07 00:32



Ich habe das als erster virtueller Host aufgelistet, und ich bekomme immer noch "Firefox kann den Server nicht finden." - SJaguar13
Ich stimme dir nicht zu. Ich hatte meinen ersten virtuellen Host-Satz ohne einen Server-Namen, jedoch scheint es einen Konflikt mit einigen virtuellen Hosts zu geben, aber nicht mit anderen. Ich habe das Problem gelöst, indem ich einen Server-Namen hinzugefügt habe, ihn jedoch auf eine zufällige Domain gesetzt habe, die sich nicht auf meinem Server befindet. Da es sich um den ersten virtuellen Host handelt, wird dieser als Standard verwendet, passt jedoch nur, wenn eine Domäne verwendet wird, die nicht mit einem anderen Servernamen übereinstimmt. - joshaidan


Reihenfolge ist wichtig - verschiebe deine vhost-Definition für alles andere an den Anfang der Liste.


3
2017-11-07 01:07





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

"Abfangen jeder Anfrage 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 bedient niemals eine Anfrage, die an eine Adresse / einen Port gesendet wurde Wenn die Anfrage einen unbekannten oder keinen Host: Header enthält, wird sie immer vom primären namensbasierten vhost geliefert (der vhost für diese Adresse / Port wird zuerst in der Konfigurationsdatei angezeigt). "

Snippet aus einer live aber verschleierten httpd-vhosts.conf die 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 Erklärung des Vhost-Matching-Prozesses finden Sie hier: http://httpd.apache.org/docs/2.2/vhosts/details.html


2
2017-11-13 16:03



_default_ wird nur für nicht übereinstimmende verwendet IPsWenn Sie vhost (*: 80) aktiviert haben, wird es nie verwendet. - Wirone


Platzhalter enthalten Ihre Site-Konfigurationsdateien:

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

Organisieren Sie Ihre Site Conf-Dateien so, dass sie in einer erwarteten Reihenfolge geladen werden. Beispiel...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

usw...

Apache liest diese in der Reihenfolge. Erstellen Sie dann eine Datei, die immer zuletzt lädt, um alle nicht übereinstimmenden virtuellen Hosts abzufangen, und eine 404 zurückgibt, anstatt eine Standard-Site 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 die Ports durch die Ports ersetzt werden, die von Ihrem httpd überwacht werden. Oder wenn Sie httpd auf bestimmten Schnittstellen überwacht haben, müssen Sie stattdessen ein Catchall für jede Schnittstelle hinzufügen:

<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 Sites in der angegebenen Reihenfolge zu laden und zu verhindern, dass nicht übereinstimmende virtuelle Hosts versehentlich eine unerwartete Site laden.


2
2018-05-25 16:50





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

Apache2 erstellt die erste geladene vhost-Datei als Standardseite.


1
2017-11-13 11:02



Standard-Apache-Installation hat auch 000-default virtueller Host aus diesem Grund. - vp_arth


beim Benutzen <VirtualHost *:port> und ServerName / ServerAlias ​​für die Hosts angeben, die Sie interessieren, was ich tun musste.

Ein bisschen Hintergrund in meiner Situation:

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

Die erste gelesene conf-Datei ist die Standardeinstellung, d.h. 000_def.conf, 001_site1.conf, 002_site2.conf wird in dieser Reihenfolge mit gelesen 000_def.conf als Standard-Site. (Hinweis: In meinem Fall habe ich diese "Dateien" in /etc/apache2/sites-enabled Das sind tatsächlich dynamische Links zu der eigentlichen Conf-Datei in /etc/apache2/sites-available)

Da ServerName in 001_site1.conf und 002_site2.conf verwendet wird, muss es auch in 000_def.conf auf etwas 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>

0
2018-03-06 01:42