Yukulélé
Yukulélé

Reputation: 17102

Apache: virtualhost on each sub-domain to corresponding directory

I would like to do something like this:

<VirtualHost *:80>
  ServerName $variable.example.com
  DocumentRoot /var/www/$variable
</VirtualHost>

for example if I go to foo.example.com it must show me /var/www/foo directory content

What is the good apache syntax for that?

Upvotes: 5

Views: 6300

Answers (2)

iautomation
iautomation

Reputation: 1084

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 client
127.0.0.1 someone.client
127.0.0.1 someone2.client

Upvotes: 0

Jon Lin
Jon Lin

Reputation: 143926

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

Upvotes: 8

Related Questions