Easier vHost setup

Starting development on a new web project is a pretty mundane task: Probably cloning some existent repository or creating the initial folder structure and then setting up a local virtual host, so each project got it’s own development domain, like fancyproject.dev.

Especially the last part is quite annoying: Manually editing the hosts-file and adding a new vHost in the Apache config files.

After years of just going with this workflow, I found a way to cut this whole process. Using dnsmasq and wildcards in the Apache config do the same thing without having to change a single line of config files.

dnsmasq

dnsmasq is a little DNS server and I only use it to route all request targeted at *.dev to the local machine and thereby make editing the /etc/hosts file redundant.

For installing it on a Mac I suggest using Homebrew, following these steps (mostly in the terminal of your choice):

$ brew install dnsmasq

$ cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf

Editing /usr/local/etc/dnsmasq.conf and adding at the end:

# dnsmasq.conf
# ...
address=/dev/127.0.0.1
listen-address=127.0.0.1

Then adding dnsmasq to the startup elements by executing $ sudo cp -fv /usr/local/opt/dnsmasq/*.plist /Library/LaunchDaemons

To start it this time, execute $ sudo launchctl start homebrew.mxcl.dnsmasq

It might be necessary to add 127.0.0.1 as the first DNS-Server in your Network Settings.

Apache Config

As it turns out you can use wildcards in the Apache config to automatically map all <project-name>.dev to .../projects/<project-name>/. Far better than editing the httpd-vhosts.conf all the time.

The single VirtualHost entry necessary is this one (Keep in mind to change the paths):

NameVirtualHost *:80

<VirtualHost *:80>
    <Directory /<path-to-your-projects-root>/>
        Options Indexes MultiViews FollowSymLinks Includes
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    UseCanonicalName off
    ServerName localhost
    ServerAlias *.dev
    VirtualDocumentRoot /<path-to-your-projects-root>/%1/
</VirtualHost>

Voilá! Now all I need to do is create a new directory and drop the files in. The vHost comes automatically.