Apache Default / Catch-All Virtual Host?


67

Se ho 3 domini, domain1.com, domain2.com e domain3.com, è possibile impostare un host virtuale predefinito per i domini non elencati? Ad esempio, se avrei:

<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>

Se registri un dominio e lo punti al mio server, per impostazione predefinita tutto mostrerebbe lo stesso dominio3. È possibile?

Risposte:


45

Sì, dovrebbe funzionare, tranne ServerAlias ​​dovrebbe essere "*", con ServerName impostato su un nome host effettivo. Potrebbe essere necessario assicurarsi che VirtualHost sia l'ultimo caricato ...


Dovrebbe funzionare, ma non lo fa. Se un dominio non è elencato specificamente, ricevo "Firefox non riesce a trovare il server".
SJaguar13,

2
L'hai impostato come "ServerName host" e "ServerAlias ​​*"? Inizialmente non l'ho sottolineato abbastanza, ma ServerName non accetta caratteri jolly, ma solo ServerAlias. ServerName deve essere un nome host effettivo.
Freiheit,

Inoltre, funzionano gli altri host virtuali? Quale versione di Apache?
Freiheit,

"Firefox non riesce a trovare il server." non è un problema di Apache. Hai bisogno di maggiori dettagli (quale server viene contattato, qual è il codice di errore ...)
Law29

Strano che non funzioni per me, sceglie sempre il primo virtualhost indipendentemente
dall'intestazione

80

Quando si utilizzano host virtuali basati sul nome, la prima configurazione dell'host virtuale caricata sarà quella predefinita (Fonte: Apache Wiki ). Ad esempio, con la configurazione seguente, i domini non corrispondenti corrisponderanno a 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>

Molti server non hanno un file di configurazione monolitico, ma hanno diversi file di configurazione specifici dell'host organizzati come segue:

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

In questo caso, per caricare prima una particolare configurazione dell'host virtuale, rinominare il collegamento simbolico in qualcosa che sarà il primo quando verrà ordinato, come 00-default.


Alcune delle altre risposte non sono del tutto corrette. Secondo Apache Wiki, non impostare un ServerNamein un host virtuale non è corretto. Se l'host senza a ServerNamenon viene caricato per primo, Apache potrebbe non usarlo nemmeno, poiché il primo host caricato sarebbe l'impostazione predefinita.

Inoltre, sebbene ServerAlias *corrisponda effettivamente a qualsiasi cosa, può anche sostituire altri host virtuali definiti in seguito. Forse questo approccio funzionerebbe se fosse sempre l' ultimo host virtuale a essere definito (come nella configurazione fornita nella domanda), ma questo significa aggiungere una nuova direttiva e cambiare l'ordinamento invece di cambiare semplicemente l'ordine come sopra.


+ 1 milione di Internet a te, signore! Deve essere il primo ad essere predefinito.
Ryan,

Sai quale viene prima, httpd.conf o conf.d / xyz.conf?
Esa Varemo,

2
"la prima configurazione dell'host virtuale caricata sarà quella predefinita" risolto il mio problema con i domini SSL locali su XAMPP (Windows). Sembra che Apache utilizzi il primo vhost come predefinito per ogni porta, quindi per gestire correttamente domini non corrispondenti per entrambe le richieste non sicure / protette, dovrebbero esserci 2 configurazioni "predefinite" esplicite per le porte 80/443 definite all'inizio dihttpd-vhosts.conf
Wirone,

1
@EsaVaremo - httpd.conf verrà caricato per primo e avrà una riga Includi che genera conf.d / xyz.conf (o probabilmente, conf.d / *). qualsiasi configurazione (inclusi vhosts) prima che la riga Includi verrà elaborata per prima; qualsiasi cosa dopo la riga include viene elaborata dopo i file inclusi.
Dan Pritts,

7

Non specificare un servername e questo diventa il tuo vhost predefinito.

<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> 

Assicurati inoltre di non aver specificato DocumentRoot nel file httpd.conf principale, poiché ciò avrà la precedenza sui vhosts.


L'ho elencato come primo host virtuale elencato e ottengo ancora "Firefox non riesce a trovare il server".
SJaguar13

2
Non sono d'accordo. Ho avuto il mio primo host virtuale impostato senza ServerName, tuttavia, sembra in conflitto con alcuni host virtuali, ma non altri. Ho risolto il problema aggiungendo un ServerName, ma impostandolo su un dominio casuale che non è sul mio server. Poiché è il primo host virtuale, viene utilizzato come predefinito, ma corrisponde solo quando viene utilizzato un dominio non associato a nessun altro NomeServer.
joshaidan,

3

L'ordine è importante: sposta la definizione del tuo vhost per tutto il resto in testa all'elenco.


2

Utilizzare l'host virtuale _default_ e posizionarlo prima in httpd-vhosts.conf come specificato in http://httpd.apache.org/docs/2.2/vhosts/examples.html

"Catturare ogni richiesta a qualsiasi indirizzo IP e porta non specificati, ovvero una combinazione indirizzo / porta che non viene utilizzata per nessun altro host virtuale [...] Un vhost predefinito non serve mai una richiesta inviata a un indirizzo / porta che è utilizzato per vhost basati sul nome. Se la richiesta conteneva un host sconosciuto: nessuna intestazione: viene sempre servita dal vhost principale basato sul nome (il vhost per quell'indirizzo / porta che appare per primo nel file di configurazione). "

Snippet da un httpd-vhosts.conf live ma offuscato che capita di bloccare tutti i vhosts alla porta 80:

# 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...

Una spiegazione approfondita del processo di corrispondenza del vhost è disponibile qui: http://httpd.apache.org/docs/2.2/vhosts/details.html


2
_default_viene utilizzato solo per IP non corrispondenti , quindi quando si dispone di vhost con caratteri jolly (*: 80) non verrà mai utilizzato.
Wirone,

2

I caratteri jolly includono i file di configurazione del tuo sito:

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

Organizza i file di configurazione del tuo sito in modo che vengano caricati nell'ordine previsto. Esempio...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

eccetera...

Apache li leggerà in ordine. Quindi creane uno che verrà sempre caricato per ultimo per catturare eventuali host virtuali senza pari e restituire un 404 invece di caricare un sito predefinito.

99-catchall-httpd.conf

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

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

Assicurati di sostituire le porte con qualsiasi porta su cui ascolti httpd. Oppure, se hai httpd in ascolto su interfacce specifiche, dovrai invece aggiungere una catchall per ogni interfaccia, in questo modo:

<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>

Spero che sia di aiuto. Uso questo metodo per caricare i siti nell'ordine specificato e impedire agli host virtuali senza pari di caricare involontariamente un sito imprevisto.


1

La soluzione migliore è quella di rinominare il file di configurazione del sito iniziando con un "1" in modo che venga caricato per primo e sarà il sito predefinito.

Apache2 rende il primo file vhost caricato come pagina predefinita.


l'installazione di apache predefinita ha anche 000-defaulthost virtuale per questo motivo.
vp_arth,

0

quando si utilizza <VirtualHost *:port>e si specifica ServerName / ServerAlias ​​per gli host a cui tieni, che è quello che dovevo fare.

Un po 'di background nella mia situazione:

Ho un indirizzo IP dinamico dal mio ISP, quindi il mio indirizzo IP è registrato presso una società di registrazione con indirizzo IP dinamico (nel mio caso noip.org). Uno dei miei "host" doveva essere registrato nella mia registrazione DNS come myabc.example.com come CNAME che punta a host1.ddns.net. Ma host2.ddns.net è stato lasciato così com'è. Volevo che myabc.example.com e host1.ddns.net andassero al sito1 e host2.ddns.net andassero al sito 2 e qualsiasi altra cosa incluso il mio indirizzo IP tornasse ai valori predefiniti.

La prima lettura file di configurazione sarà il valore predefinito, vale a dire 000_def.conf, 001_site1.conf, 002_site2.confverrà letta in questo ordine con 000_def.confil sito predefinito. (nota: nel mio caso, ho questi "file" in /etc/apache2/sites-enabledcui sono in realtà collegamenti dinamici al file conf attuale /etc/apache2/sites-available)

Poiché ServerName viene utilizzato in 001_site1.conf e 002_site2.conf, deve anche essere impostato su qualcosa in 000_def.conf.

# 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.