Mi sono anche imbattuto in questa domanda su Google per il fallback del vhost dinamico di apache2 e la risposta di Luc mi ha aiutato molto a risolvere il mio problema, ma voglio ancora mostrare cosa ho fatto per raggiungere i miei obiettivi, principalmente perché comportava alcuni lavori extra e perché penso potrebbe essere utile per eventuali googler futuri ...
I miei obiettivi
- vhosting dinamico per tutti i domini e sottodomini che puntano al mio VPS
foo.com dovrebbe servire lo stesso contenuto di www.foo.com
- fallback per domini sconosciuti a una sorta di impostazione predefinita
- fallback per sottodomini sconosciuti di
foo.coma www.foo.commeno che wwwnon sia disponibile, fallback invece al valore predefinito
DNS
Ho un paio di domini (e tutti i loro sottodomini) che puntano al mio VPS, ad esempio:
- foo.com
- bar.com
- foobar.com
filesystem
Ho le seguenti directory, i domini contengono directory con i nomi dei sottodomini disponibili, è richiesta la directory www, ma la configurazione dovrebbe essere in grado di gestire la situazione in cui non è presente. Localhost viene utilizzato come fallback predefinito:
/var
/www
/localhost
/foo.com
/www
/bar
/bar.com
/foo
test
Traducendo i miei obiettivi in casi verificabili:
- foo.com dovrebbe essere servito da foo.com/www
- www.foo.com dovrebbe essere servito da foo.com/www
- bar.foo.com dovrebbe essere servito da foo.com/bar
- foo.foo.com dovrebbe essere servito da foo.com/www (foo.com/foo non esiste)
- bar.com dovrebbe essere servito da localhost (bar.com/www non esiste)
- www.bar.com dovrebbe essere servito da localhost (bar.com/www non esiste)
- foo.bar.com dovrebbe essere servito da bar.com/foo
- bar.bar.com dovrebbe essere servito da localhost (bar.com/bar non esiste)
- foobar.com dovrebbe essere servito da localhost (foobar.com non esiste)
- www.foobar.com dovrebbe essere servito da localhost (foobar.com non esiste)
- foo.foobar.com dovrebbe essere servito da localhost (foobar.com non esiste)
La soluzione
Questo utilizza: mod_rewrite, mod_proxy_httpe naturalmente mod_vhost_alias.
ServerName my.domain
ServerAdmin admin@my.domain
<VirtualHost *:80>
ServerName localhost
VirtualDocumentRoot /var/www/localhost
</VirtualHost>
<VirtualHost *:80>
ServerName sub.domain
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3 !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteCond /var/www/%2.%3/www !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
</VirtualHost>
<VirtualHost *:80>
ServerName bare.domain
ServerAlias *.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)$ [NC]
RewriteCond /var/www/%1.%2 !-d [OR]
RewriteCond /var/www/%1.%2/www !-d
RewriteRule (.*) http://localhost/$1 [P]
</VirtualHost>
Come funziona? Sono definiti tre host virtuali:
localhost
Localhost funge da predefinito. Tutte le richieste non risolvibili sono servite da localhost. Configurare un collegamento simbolico da localhost a uno dei tuoi domini è come impostare quel sito come predefinito.
sub.domain
Il vhost del sottodominio accetta tutte le richieste sotto forma di *.*.*. Per impostazione predefinita, tutte le richieste vengono soddisfatte /domain.com/subcome definito da VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3.
ricaderci:
Il primo RewriteRulesi occupa di domini sconosciuti, ad es. domain.comla directory non esiste, eseguendo il proxy del sito Web localhost.
Il secondo RewriteRuleinoltre esegue il proxy a localhost quando non sono presenti sia domain.com/subla domain.com/wwwdirectory che la directory.
Il terzo RewriteRuleproxy a domain.comquando domain.com/subnon esiste. Sappiamo domain.com/wwwche esiste a causa del secondo blocco di riscrittura.
bare.domain
Il vhost bare.domain accetta le *.*richieste e le serve/domain.com/www
Qui il RewriteRuleproxy sarà localhost quando domain.como domain.com/wwwnon esistono.
^ $%. * !!!
Ho avuto qualche problema confezionamento mia testa intorno a tutti coloro $e %segni nella RewriteConde RewriteRulecosì spiegherò su di loro qui:
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
- I
*nel ServerAliassono solo caratteri jolly.
- Gli
%nin VirtualDocumentRootsono dal nome del documento interpolazione .
- I
%nnel secondo si RewriteCondriferiscono alle selezioni (.*)dal primo RewriteCond, ad es. le parti del dominio richiesto.
- Anche
%nnel RewriteRulefare.
- Il
$1in si RewriteRuleriferisce alla selezione (.*)all'inizio del RewriteRule. Che cattura tutto dal dominio fino all'URL ?della richiesta. Qualsiasi querystring viene automaticamente aggiunta all'URL da mod_proxy.