Apache: virtualhost on each sub-domain to corresponding directory
You can't have $variable
like that in servername and map it to the document root, but you can use mod_rewrite and a wildcard.
<VirtualHost *:80> ServerName subdomain.example.com ServerAlias *.example.com DocumentRoot /var/www/ RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTP_HOST} ^([^.]+)\. RewriteCond %{REQUEST_URI}::%1 !^/([^/]+).*::\1 RewriteRule ^(.*)$ /%1/$1 [L]</VirtualHost>
The subdomain.example.com
can just be any subdomain that isn't www.example.com
. For any request that doesn't start with "www", the subdomain is captured as a group (2nd condition), then the next line makes sure the request isn't already being routed into the subdomain's name, and the rule routes it.
So for the request:
http://foo.example.com/bar/x.html
it gets routed to:
/foo/bar/x.html
This is what I use with my freelancer work:
Under httpd-vhosts.conf:
UseCanonicalName Off<VirtualHost *:${AP_PORT}> DocumentRoot ${US_ROOTF_WWW}/_client ServerName client ServerAlias client <Directory "${HOME}\www\_client"> Require all granted </Directory></VirtualHost><VirtualHost *:${AP_PORT}> VirtualDocumentRoot "${US_ROOTF_WWW}/_client/%1" ServerName subdomains.client ServerAlias *.client <Directory "${HOME}\www\_client\*"> Require all granted </Directory> </VirtualHost>
Then under the windows hosts file place the domain and subdomains that are needed.
127.0.0.1 client127.0.0.1 someone.client127.0.0.1 someone2.client