Generally all web development should take place on a local development
environment. Often usually this includes an AMP-stack. One great feature of
Apache is the ability to set up virtual hosts using configuration files. After
setting the virtual host configuration, changing the system’s
hosts file to
point a certain domain name to
127.0.0.1 will allow
http://localhost/projectname (which could be pointing to
/path/to/www/projectname/ on the system) to become
This might get a bit frustrating though, especially if you constantly need to
create new local development projects and each should be able to be accessed
*.local or similar development development domain names.
On Windows there is a way to achieve automation for this process. All you need is an Apache installation with mod_vhost_alias module installed, Acrylic DNS Proxy and a few IP addresses from your internet service provider. There are guides for achieving the same results on Mac and Linux systems, though Acrylic should be replaced with an alternative such as dnsmasq
Please note: I use Windows 7 and XAMPP as my development environment. XAMPP is a prepackaged installation that handles each Apache, MySQL and PHP at the same time. You can install them separately in any way you want. MySQL and PHP are not even needed for this to work.
Setting up Apache virtual hosts
As mentioned, you need Apache and the
mod_vhost_alias installed on your
Often just a simple change to
mod_vhost_alias for Apache.
Just browse to the extensions list inside the configuration file and uncomment
the correct line (
LoadModule vhost_alias_module modules/mod_vhost_alias.so or
similar), unless already uncommented.
If the module needs to be installed by hand, you will need to download
mod_vhost_alias.so and place it inside the apache/modules directory. After
that create a new line (or uncomment if already present) to the
file extension listing which reads
LoadModule vhost_alias_module modules/mod_vhost_alias.so.
After this we need to decide where to keep our virtual hosts (in our case the
directories that will be converted to virtual hosts). In this example we’ll just
We need to make an addition inside Apache’s
extra-vhosts.conf (or where ever
your installation holds virtual host declarations). There you should insert the
following configuration block:
# Feel free to remove the empty lines to # save space, I inserted them here to # make the example look cleaner. <Virtualhost *:80> VirtualDocumentRoot "C:/localhost/%-2+" ServerName %-2+.local ServerAlias %-2+.local UseCanonicalName Off <Directory "C:/localhost/%-2+"> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny Allow from all </Directory> </Virtualhost>
I am not entirely certain of the low-level details on these configuration rules (I’m a web developer, not a server engineer), but I’ll try to explain. Correct me in the comments in case I say something outright wrong.
First we declare a new
VirtualHost block, in which we type in our new rules.
After opening the block, we use
VirtualDocumentRoot to determine the
directories which we want to be served using virtual hosts. In this case we want
to serve all directories under
C:\localhost as virtual hosts. The
determines which directory is mapped to each domain part. In this situation,
example.local would look for
After setting the
VirtualDocumentRoot, we set our server name and server alias
%-2+.local for both. You can replace
similar if you want to (but keep in mind this is what should be inserted to
Acrylic’s hosts file later on).
Remember to turn off
UseCanonicalName, as we are not setting named virtual
hosts. Named virtual hosts use
UseCanonicalName to set certain domain names
properly. I’m not exactly sure how it does this, but it relates to request
Host headers it seems. Set the value as
Lastly we set
Directory rules for all the virtual host directories. Remember
to save the file before closing it.
Now we need to restart Apache to take the new configuration to use. Refer to the Apache manual or the AMP-stack provider’s documentation on how to do it. XAMPP has a little control panel which makes this simple.
That’s it, now we need to tell Windows to map the required types of domain names to reroute back to localhost for use with Apache.
Setup Acrylic DNS Proxy
Acrylic DNS Proxy
takes care of mapping our
*.local requests to our Apache installation (which
in turn checks the requests and maps each to a dynamic virtual host if
Download and install Acrylic as guided, I installed it under
I usually do for my software. After installation the Acrylic service should
start by itself.
Next we modify the custom
hosts file that Acrylic offers. You can find it in
the start menu under Acrylic DNS Proxy → Config → Edit Custom Hosts File. Insert
the following line to the end of the file:
You can add more on new lines, in case you want to use
.dev or others. Be sure
not to use any common TLDs such as
.net, as Acrylic may block all
connectivity to those domains if you do so.
Save and close the custom
hosts file. After the edit(s) we need to restart the
Acrylic service. Inside start menu go to the Acrylic Config section and restart
the service by using Restart Acrylic Service.
Using the Acrylic DNS Proxy server on Windows
When the Acrylic settings have been setup, our system needs to be told to look
for domain name server data from the system itself. This happens by adding our
own IP (
127.0.0.1) to our DNS address list for our network interface adapter.
I set the Acrylic server IP (
127.0.0.1) as the primary DNS address, with the
two next DNS addresses as the DNS IP addresses provided by my internet service
I’m not going to go through setting custom DNS addresses for Windows, as there a quite many guides for that on the internet already. Here’s two to get you started:
- How can I change my computers DNS address? at Computer Hope
- How To Manually Set DNS Server(s) On A windows 7 at MixedUpEric.com
Now the local Acrylic server should be in use when resolving domain names. If
you now try (and have content inside the
VirtualDocumentRoot), your own
dynamic domains and automated virtual hosts should be working. And on top of
that, the regular
http://localhost/site/ configuration should be working
alongside dynamic virtual hosts just fine.
Please note: some developers have noticed that after setting this automation in
place, their PHP global variable
DOCUMENT_ROOT is not working properly, and
instead points to the original Apache document root configuration variable
instead. There are some guides and discussions on how to fix this. One option is
to develop websites and applications without relying on the
Remember, I’m a web developer and not a server manager. This means I may have some mistakes here and there, but at least for me this setup seems to be working just fine. Please do correct me in the comments if you feel like it. I’ll gladly fix errors and maybe-maybe-nots in this tutorial.