Apache: virtualhost on each sub-domain to corresponding directory Apache: virtualhost on each sub-domain to corresponding directory apache apache

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