2009-02-15 12 views
14

Utilizzo di Apache2 su un sistema Linux esiste un modo per avere più VirtualDocumentRoot utilizzando mod_vhost_alias?Apache Multiple VirtualDocumentRoot

Questa convenzione è la denominazione Attualmente sto usando e vorrei continuare a utilizzare:

host     directory 
127.0.0.1 domain  domain.com 
127.0.0.1 sub.domain domain.com_sub 

Poi nella mia sezione vhosts del httpd.conf ho:

NameVirtualHost 127.0.0.1 

<VirtualHost 127.0.0.1> 
    VirtualDocumentRoot /var/www/%0.0.com 
</VirtualHost> 

<VirtualHost 127.0.0.1> 
    VirtualDocumentRoot /var/www/%2.0.com_%1 
</VirtualHost> 

Il problema con questo è quando visito sub.domain il log degli errori di Apache mostra che sta cercando /var/www/sub.domain.com piuttosto che /var/www/domain.com_test che mi porta a credere che legga solo la prima regola e poi fallisce, ma quello che vorrei fosse è usare qualsiasi root di documenti che soddisfi entrambi delle due regole VirtualDocumentRoot.

+4

Sto assumendo avete risolto questo problema, ma ho postato qui sotto per completezza, dal momento che questo emerge nelle ricerche su google. Si potrebbe voler marcare questa domanda come risposta? – starmonkey

risposta

13

In genere Apache sceglie il primo host virtuale il cui ServerName o ServerAlias corrisponde al nome host fornito nell'intestazione HTTP Host HTTP. Nel tuo caso, dal momento che non disponi di direttive ServerName, Apache utilizza presumibilmente una ricerca DNS inversa sull'indirizzo IP per falsificare il nome di un server, e presumendo che il DNS inverso porti a domain.com, che non corrisponde, Apache quindi si imposta automaticamente su il primo host virtuale. Sembra complicato, lo so ... la linea di fondo è che dovresti usare ServerName e ServerAlias per rendere esplicita la configurazione. Provare qualcosa di più simile a questo:

NameVirtualHost 127.0.0.1 
<VirtualHost 127.0.0.1> 
    ServerName domain.com 
    ServerAlias www.domain.com 
    VirtualDocumentRoot /var/www/%0 
</VirtualHost> 
<VirtualHost 127.0.0.1> 
    ServerName sub.domain.com 
    ServerAlias *.domain.com 
    VirtualDocumentRoot /var/www/%2.%3_%1 
</VirtualHost> 

Questo dovrebbe utilizzare /var/www/domain.com per http://domain.com e /var/www/www.domain.com per http://www.domain.com, entrambi i quali sono serviti dal primo vhost e /var/www/sub.domain.com per http://sub.domain.com, /var/www/blah.domain.com per http://blah.domain.com, e così via.

+0

Questo mi ha salvato la giornata. Stavo passando da due file VirtualHost con le definizioni di VirtualDocumentRoot. Sapevo che doveva esserci un modo migliore e tu l'hai capito. Grazie! –

+0

La soluzione ha risolto il mio problema. Ma ho una nuova domanda, per alcuni sottodomini speciali, ho bisogno di fare qualche configurazione speciale, come aggiungere JK config, o impostare un file di log personalizzato. Come possiamo farlo? – Stony

+0

@Stony Suggerisco di chiedere su [webmasters.SE] o forse [SF]. –

2

Per quanto riguarda il PO e il problema con "/ var/www/html "set:

Il problema che ho avuto è stato l'utilizzo di% 1 anziché% 2. Ecco il mio esempio:

ServerAlias www.*.org.au 
UseCanonicalName Off 
VirtualDocumentRoot /path/to/sites/%2/pub 

La speranza che aiuta qualcuno!

Ho letto i documenti su "Interpolazione nome directory" in mod_vhost_alias docs.

4

Devi qualificare le backferfer quando vuoi inserire un '.' nel percorso del file. Quindi è necessario avere questo tipo:

VirtualDocumentRoot /var/www/%2.0.%3_%1 
0

Ho finalmente trovato una configurazione che consente la creazione di sottodomini flessibile.

Vedere documentazione Apache su mod_vhost_alias

Se il tuo dominio dev principale dispone di 3 parti come dev.example.com è possibile utilizzare %-4+ come segnaposto per qualsiasi cosa prima del dominio principale. Se ha 4 parti, usa %-5+.

<VirtualHost *:80> 
    VirtualDocumentRoot "/var/www/%-4+/webroot" 
    ServerName www.dev.example.com 
    ServerAlias *.dev.example.com 
    php_admin_value auto_prepend_file /var/www/setdocroot.php 
</VirtualHost> 

In questo modo è possibile creare una directory di nome /var/www/sub.domain/webroot e accedervi con l'url sub.domain.dev.example.com.

La linea php_admin_value auto_prepend_file /var/www/setdocroot.php fissa il docroot su alcuni sistemi, come OSX 10.9+

Ecco il contenuto di setdocroot.php:

<?php 
$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']); 
?>