When using Apache to host websites, developers tend to either have one configuration file with multiple sites defined within in it (often /etc/httpd/httpd.conf or similar), or end up dealing with a swarm of separate files in /etc/apache2/sites-available – one per domain.
If all the domains are identical, in terms of file structure – apart from the hostname – then we can use Apache’s mod_vhost_alias module to simplify the configuration. When combined with mod_rewrite and use of some Apache environment variables (e.g. %{HTTP_HOST}), your configuration can become much more manageable.
So, you can go from multiple virtual hosts configured similar to the below – where all that’s changing between site(s) is effectively the hostname – :
<Virtualhost *:80> ServerName mydomain.com ServerAlias www.mydomain.com DocumentRoot /var/www/vhosts/mydomain.com/public/ <Location '/'> Allow from ALL AllowOverRide ALL </Location> CustomLog /var/log/apache2/mydomain.com-access.log combined ErrorLog /var/log/apache2/error.log </VirtualHost>
To :
<VirtualHost *:80> UseCanonicalName Off VirtualDocumentRoot /var/www/vhosts/%0/public/ <Location '/'> Allow from ALL AllowOverRide ALL </Location> CustomLog /var/log/apache2/%{HTTP_HOST}-access.log combined ErrorLog /var/log/apache2/error.log </VirtualHost>
Advantages:
- Once the directory structure has been created (and DNS configured) sites can be served immediately
- No need to restart Apache,
- No need to create a new configuration file (one per site etc)
Disadvantages:
- Perhaps difficult to handle e.g. www.mydomain.com and mydomain.com being hosted from the same directory (leading to symlinks in e.g. /var/www/vhosts).
- Have to rely on .htaccess files for per-site configuration (which may not be desirable ).