Apache può gestire un'infinità di virtual host, e prevede strumenti per la gestione automatica di un gran numero di domini virtuali, che rende estremamente comoda la vita di grandi provider, registrar e chiunque si ritrova a gestire più di poche decine di domini virtuali su un singolo server.
Fondamentalmente sono utilizzabili 3 diversi metodi, tramite tre moduli.
- mod_rewite
- mod_perl (script perl)
- mod_vhost_alias
MOD_REWRITE
Tramite la direttive gestite dal modulo mod_rewrite è possibile configurare dinamicamente dei virtual host name-based.
Abilitazione del modulo mod_rewrite
RewriteEngine on
Test per l'host header per estrarre il nome del dominio
RewriteCond %{HTTP_HOST} ^www\.(.+)$
Rewrite dell'URL per redirezionare il client alla risorsa richiesta
RewriteRule ^/(.+)$ /home/www/%1/$1 [L]
In questo caso se il client richiede http://www.openskills.info/index.php le rule di rewrite convertiranno la richiesta per accedere alla risorsa che risiederà in /home/www/openskills.info/index.php.
Il vantaggio di utilizzare questo metodo è che non bisogna riavviare Apache per aggiungere un virtualhost ma semplicemente aggiungere la entry nel prorio DNS.
Lo svantaggio, come con tutti i domini virtuali name based, è che può funzionare solo con i browser che utilizzano il protocollo HTTP/1.1 e che ogni dominio deve poter essere risolto con il dns.
MOD_PERL
E' possibile tramite il linguaggio di programmazione perl scrivere un piccolo script da includere nel file httpd.conf fra i tag <perl> .
Esempio:
Apertura del tag perl ed inizializzazione dello script da includere nel file httpd.conf
<Perl>
#!/usr/bin/perl -w
Definizione di alcune variabili
local ($ip,$host,$admin,$vroot,$aliases);
local ($directive,$args);
Apertura e parsing del file di configurazione
open (FILE,"/usr/local/apache/conf/vhost-perl.conf")
while (<FILE>) {
Skippa tutte le linee che iniziano con #
next if /^\s*(#|$) / ;
if (/^d+/) {
($ip,$host,$admin,$vroot,$aliases)=split /\s*,\s*/, $_;
$VirtualHost{ip}= {
ServerName =>$host,
ServerAdmin => $admin,
DocumentRoot => "/home/www/".$vroot,
ErrorLog => "logs/".$host."_error.log",
TransferLog =>"logs/".$host."_access.log"
};
Gestione Alias
$VirtualHost {$ip} {ServerAlias} =$aliases if $aliases;
Gestione della direttiva port
$VirtualHost {$ip} {Port} =$1 if ($ip=~/:(\d+)$/);
Aggiunta di eventuali direttive, specificate nel file di configurazione /usr/local/apache/conf/vhost-perl.conf
} elseif ($ip) {
($directive,$args)=split / /, $_,2;
$VirtualHost {$ip} {$directive}=$args;
}
}
Chiusura del file e dello script
close (file);
_END_
<Perl>
Il passo successivo è quello di creare il file di configurazione /usr/local/apache/conf/vhost-perl.conf secondo la seguente sintassi:
IP(:port), hostname,ServerAdmin,document root, aliases
Direttive Opzionali
Esempio:
213.198.151.253:80, openskills.info, [email protected] /home/www/openskills
MOD_VHOST_ALIAS
La configurazione base per i virtualhost name-based è la seguente:
UseCanonicalName off
VirtualDocumentRoot /home/www/%0
Invece per i virtualhost ip-based:
UseCanonicalName DNS
VirtualDocumentRoot /home/www/%0
Dove %0 è l'hostname dedotto dall'host header inviato dal client nel primo caso e nel secondo è il risultato della query effettuata al DNS.
Inoltre è possibile affiancare altre direttive per completare la configurazione di un virtualhost:
-VirtualDocumentRootIP
E' possibile identificare la document root attraverso l'IP piuttosto che con il nome dell'host.
VirtualDocumentRootIP /home/www/%0
Dove %0 è l'IP dell'host, quindi l'url verrà rimappata in /home/www/213.198.151.253 nel caso di openskills.info.
-VirtualScriptsAlias e VirtualScriptsAliasIP per specificare le directory dove risiedono i CGI:
VirtualDocumentRoot /home/www/%0/html
VirtualScriptsAlias /cgi-bin/ /home/www/%0/cgi-bin
o
VirtualDocumentRootIP /home/www/%0/html
VirtualScriptsAliasIP /cgi-bin/ /home/www/%0/cgi-bin
-ScriptAliasMatch
Direttiva simile a VirtualScriptsAliasIP e VirtualScriptsAlias che permette di definire una singola directory contenente cgi-script per tutti i virtual host:
ScriptAliasMatch /cgi/bin /home/www/.*/cgi-bin/