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.com
a www.foo.com
meno che www
non 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_http
e 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/sub
come definito da VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
.
ricaderci:
Il primo RewriteRule
si occupa di domini sconosciuti, ad es. domain.com
la directory non esiste, eseguendo il proxy del sito Web localhost.
Il secondo RewriteRule
inoltre esegue il proxy a localhost quando non sono presenti sia domain.com/sub
la domain.com/www
directory che la directory.
Il terzo RewriteRule
proxy a domain.com
quando domain.com/sub
non esiste. Sappiamo domain.com/www
che 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 RewriteRule
proxy sarà localhost quando domain.com
o domain.com/www
non esistono.
^ $%. * !!!
Ho avuto qualche problema confezionamento mia testa intorno a tutti coloro $
e %
segni nella RewriteCond
e RewriteRule
così 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 ServerAlias
sono solo caratteri jolly.
- Gli
%n
in VirtualDocumentRoot
sono dal nome del documento interpolazione .
- I
%n
nel secondo si RewriteCond
riferiscono alle selezioni (.*)
dal primo RewriteCond
, ad es. le parti del dominio richiesto.
- Anche
%n
nel RewriteRule
fare.
- Il
$1
in si RewriteRule
riferisce 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
.