Professional and Affordable Web Design

0800 080 5401

Configure automatic subdomains with Apache

In this article I will show you how to configure your Apache server so you have subdomains redirecting (pointing) automatically to folders of subdomain name. Imagine running a development server, and having people working on an increasing number of different projects. Normally you would set up a Virtual Host configuration in Apache for every subdomain, and add an entry into DNS configuration for every subdomain.

In order for this configuration to be easy to test for the purpose of this article we will configure automatic subdomains for a localhost. Our goal is to be able to add a new subdomain only by adding a new folder in /var/www/localhost/, for example when we add directory /var/www/localhost/test all of its content should be accessible via http://test.localhost .

Also, we will be using Linux operating system, but this configuration can work on other UNIX and Windows boxes as well.

What software will I need?

We will need several software packages, firstly Apache2 ( although this has been tested on version 2.2.9, it should be also working on versions 1.x.x and older ). Our Apache server should have rewrite module enabled, check /etc/apache2/mods-enabled for symlink rewrite.load – if it is not there, you probably need to enable it ( use sudo a2enmod command for this ). Module alias should be enabled the same way as rewrite is.

We will be also needing a DNS server software – bind9 will do great. Of course you will be also needing some text editor to modify configuration files – feel free to use editor of you choice, as long as it is vim, of course :-).

Configuring DNS

Having DNS server running at your local machine is a good idea not only when developing websites. DNS servers have caching, so basically if there are some websites that you are visiting often – they should load faster with local DNS server. First of all we need our system to use our own DNS server, so edit /etc/resolv.conf file to have following contents:

nameserver 127.0.0.1

you can do it by running this in your shell:

sudo bash
echo “nameserver 127.0.0.1” > /etc/reslv.conf

Make sure that NetworkManager is not overwriting this file, and if so – setup NetworkManager to use 127.0.0.1 as your domain name server.

Now it's time to install bind9 server, if you are running debian/ubuntu based system run:
sudo apt-get install bind9

Once installed we need to configure it, all of bind9 configuration files can be found in /etc/bind directory. For now we will be interested in /etc/bind/db.local file. At the end of this file add a new line:
* IN A 127.0.0.1

So the file looks like this:

/etc/bind/db.local file
$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
@       IN      A       127.0.0.1
@       IN      AAAA    ::1
*       IN      A       127.0.0.1

 

Now restart your bind server with:sudo /etc/init.d/bind9 restart

Once your DNS server is restarted you should be able to access it through whatever.localhost. Test it with host whatever.localhost and if everything is working right you should get this:
~$ host whatever.localhost
whatever.localhost has address 127.0.0.1

Now no matter what subdomain name you enter for localhost it will always redirect to 127.0.0.1. This will be all that we need from DNS server, now it's time to configure your http server.

Configuring Apache

All we have to do with our Apache configuration is to update default vhost configuration, so we will be editing /etc/apache2/sites-available/default file. File probably now looks like this:

sample code


NameVirtualHost localhost 
 
ServerAdmin webmaster@localhost

DocumentRoot /var/www

Options FollowSymLinks
AllowOverride None
Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined Alias /doc/ "/usr/share/doc/"
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128

 

First we will have to add ServerName and ServerAlias options:

ServerAlias localhost *.localhost
ServerName localhost

You can put those directly under <VirtualHost localhost> . Now we will write rewrite rules so subdomains will be pointing to folders (in directory /var/www/localhost/) of name of subdomain.

rewrite rules
	RewriteEngine on 
	RewriteCond %{HTTP_HOST} !^www.* [NC] 
	RewriteCond %{HTTP_HOST} ^(.*)\.localhost
	RewriteCond /var/www/localhost/%1 -d 
	RewriteRule ^(.*) /%1/$1 [L]

We should also change the document root for our localhost vhost to /var/www/localhost. Let's now put everything together, and we will get our /etc/apache2/sites-available/default file.:

/etc/apache2/sites-available/default file

NameVirtualHost localhost 
 
ServerAdmin webmaster@localhost

DocumentRoot /var/www

Options FollowSymLinks
AllowOverride None
Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined Alias /doc/ "/usr/share/doc/"
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128

Now you need to create your server root directory:
sudo mkdir /var/www/localhost

It is time now to restart your Apache server ( sudo /etc/init.d/apache2 restart )

That is all, you can now test your configuration by creating a directory in /var/www/localhost/ for example “testsubdomain” and visiting http://testsubdomain.localhost with your browser.

Comments1 Comments

Tim

Developing locally: Perhaps vi /etc/hosts add 127.0.0.1 mysite :wq Then open a new tab in FF enter mysite Then you don't need to run local DNS servers, also hosts is faster. Vhosts in Apache: create/copy existing vhost config cp: /etc/apache2/sites-available/site1.conf /etc/apache2/sites-available/site2.conf or use in conjunction with sed.

19 June 2009

All comments are moderated for spam and will not be shown. All genuine comments wil be show, however the links will be based on a NO FOLLOW RULE. Repeat commenters adding value to the articles and discusions will have removed alowing Follow Rule to Work.

Make a Comment

Notify me when someone responds

Quick Contact

See Full Portfolio Some Of Our Work

Screenshot of dsbs.co.uk website
dsbs.co.uk

Driving Schools Booking Service (DSBS) is a network of driving instructors, covering the whole of the UK. For this project, we were...

Screenshot of countysecurity.co.uk website
countysecurity.co.uk

County Security is a fully featured E - commerce solution, with an integrated "system configurator", which allows users to choose...

Customer News & Resources

At Mutiny Design we are constantly gathering together articles and help guides to assist our clients.

Introduction to sitemap.xml

Checking for a sitemap A site map (or sitemap) is a list of pages of a web site accessible to crawlers or users. It can be either a document in any form used as a planning tool for web design, or a web page that lists the pages on a web site, Some developers feel that site index is a more appropriately used term to relay page function, web visitors are used to seeing each term and generally associate both as one and the same. However, a site index is often an A-Z index that provides access to content, while a site map provides a general... Read More »

Center a web page in CSS

One simple way to center a web page using CSS is to create a container div, that is horizontally centered by having its left and right margins set to auto. Using this method, you can still apply colours / background images to the body tag, so its a flexible solution. (if you didnt need this ability, just apply margins and width to the body tag instead, and forget using the container div). The container div has the same width as your webpage and, well, contains it. All the code for your web page is placed inside the container div. This will... Read More »

-