2009-02-09 13 views
6

Questa è probabilmente una domanda facile, ma voglio capire meglio come funziona Apache con gli host virtuali. Sto configurando host virtuali perché lavoro su più siti Web contemporaneamente e non voglio utilizzare le sottodirectory. Stavo praticamente usando il file predefinito httpd.conf di Apache con DocumentRoot che puntava a qualcosa come "/ www". Io non commentata gli host virtuali includono e ha aggiunto quanto segue:Perché http: // localhost reindirizza al mio host virtuale predefinito una volta che ho configurato gli host virtuali in Apache?

 
NameVirtualHost *:80 

<VirtualHost *:80> 
    ServerName site1.dev 
    DocumentRoot /www/site1 
</VirtualHost> 

<VirtualHost *:80> 
    ServerName site2.dev 
    DocumentRoot /www/site2 
</VirtualHost> 

Ora quando vado a http://localhost ottengo la pagina predefinita per sito1.

Sono sicuro che c'è un motivo per cui ciò ha senso, ma non lo capisco del tutto. Avrei pensato che solo le richieste esplicitamente a http://site1.test sarebbero state instradate attraverso quella direttiva e che non sarebbero diventate l'impostazione predefinita. Qualcuno può spiegare perché diventa l'impostazione predefinita.

+0

+1 perché continuo a dimenticare questo – David

risposta

11

http://httpd.apache.org/docs/1.3/vhosts/name-based.html

(dovrebbe valere per 2.x anche)

"Se non viene trovata alcuna corrispondenza host virtuale, verrà utilizzato l'host virtuale prima elencato che corrisponde all'indirizzo IP.

Di conseguenza, il primo host virtuale elencato è l'host virtuale predefinito.Il DocumentRoot dal server principale non verrà mai utilizzato quando un indirizzo IP corrisponde alla direttiva NameVirtualHost. Se si desidera disporre di una configurazione speciale per le richieste che non corrispondono qualsiasi host virtuale particolare, semplicemente mettere quella configurazione in un contenitore er ed elencalo per primo nel file di configurazione. "

+1

Posso confermare che è vero anche per Apache 2.x. –

4

risposta 1 è corretta e mi piacerebbe aggiungere con namevirtualhosts come prima voce corrisponde essenzialmente qualsiasi non-nominato altrove virtualhost

dovrebbe essere usato solo per la cattura accidentale mal-formata e il traffico interrotto

cioè un machene con un iP chiamato john.domain.com esecuzione www.domain.com e www.domain2.com come webservers validi sui ip www.xxx.yyy.zzz potrebbero avere una configurazione ottimale come così

<VirtualHost *:80> 
    DocumentRoot /var/webserver/static-sites/unknown/ 
    # a directory readable by apache with only a robots.txt denying everything 
    ServerName bogus 
    ErrorDocument 404 "/errordocuments/unknown-name.html" 
    #custom 404 describing how/what they might have done wrong try pointing a browser {with a hosts file at http://bogus/ on 193.120.238.109 to see mine# 
    ErrorLog /var/log/httpd/unknown-error.log 
    CustomLog /var/log/httpd/unknown-access.log combined 
    </VirtualHost> 

    <VirtualHost *:80> 
    DocumentRoot /var/webserver/static-sites/unknown/ 
    # a possibly different directory readable by apache with only a robots.txt denying everything 
    ServerName www.xxx.yyy.zzz 
    ServerAlias john.domain.com 
    ErrorDocument 404 "/errordocuments/ip-name.html" 
    ErrorDocument 403 "/errordocuments/ip-name.html" 
    #custom 404 telling them as a likely hacker/bot you wish to have nothing to do with them see mine at http://193.120.238.109/ 
    ErrorLog /var/log/httpd/ip-error.log 
    CustomLog /var/log/httpd/ip-access.log combined 
    </VirtualHost> 

    <VirtualHost *:80> 
    ServerName domain.com 
    RedirectPermanent/http://www.domain.com/ 
    ErrorLog logs/www.domain.com-error.log 
    CustomLog logs/www.domain.com-access.log combined 
    </VirtualHost> 

    <VirtualHost *:80> 
    DocumentRoot /var/webserver/ftpusers/domain 
    ServerName www.domain.com 
    ServerPath /domain 
    ErrorLog logs/www.domain.com-error.log 
    CustomLog logs/www.domain.com-access.log combined 
    </VirtualHost> 

    <VirtualHost *:80> 
    ServerName domain2.com 
    RedirectPermanent/http://www.domain2.com/ 
    ErrorLog logs/www.domain2.com-error.log 
    CustomLog logs/www.domain2.com-access.log combined 
    </VirtualHost> 

    <VirtualHost *:80> 
    DocumentRoot /var/webserver/ftpusers/domain2 
    ServerName www.domain2.com 
    ServerPath /domain2 
    ErrorLog logs/www.domain2.com-error.log 
    CustomLog logs/www.domain2.com-access.log combined 
    </VirtualHost> 
0

Un modo per farlo è:

  1. Nella configurazione VirtualHosts, immettere il nome specifico sito locale si desidera attivare invece di utilizzare un carattere jolly: <VirtualHost site1.dev:80> invece di <VirtualHost *:80>

  2. Spegnere NameVirtualHost *:80 che può essere fatto commentando fuori nel file vhosts.conf

  3. nel vostro file/etc/hosts menziona entrambi gli alias per l'IP di loopback: 127.0.0.1 localhost site1.dev

Questo è tutto. Dovresti vedere che localhost va al DocumentRoot predefinito come al solito e site1.dev va al sito che hai configurato come host virtuale.

2

Confermando che per Apache 2.x, verrà utilizzato il primo host virtuale (con lo stesso numero di porta) se non viene trovato un host virtuale corrispondente.

http://httpd.apache.org/docs/2.2/vhosts/details.html

"Se non vhost corrispondenza è stata trovata la richiesta viene servita dalla prima vhost con un numero di porta di corrispondenza che è sulla lista per l'IP al quale il client collegato"

Puoi sempre aggiungere questo codice qui sotto, metterlo sotto NameVirtualHost *:80 in modo che la tua root di documento predefinita sia servita di default se nessun altro host virtuale viene trovato.

<VirtualHost *:80> 
    ServerName localhost 
    DocumentRoot /my/default/document/root 
</VirtualHost> 
Problemi correlati