VirtualDocumentRoot with Nginx


I recently upgraded our internal LEMP stack to use Nginx instead of Apache and one of the feature I missed was the VirtualDocumentRoot directive from a module called mod_vhost_alias to dynamically set the DocumentRoot like this:

<VirtualHost *:80>

    DocumentRoot  /var/www
    ServerName    example.com

    UseCanonicalName    Off
    VirtualDocumentRoot /var/www/%0

</VirtualHost>

This is very usefull for any local or staging environement where you don’t want to create a seperate vhost everytime you need to setup a new project. Instead you just have to create a folder.

/var/www/example.com -> http://example.com
/var/www/127.0.0.1.xip.io -> http://127.0.0.1.xip.io

Now if you want to use this feature in Nginx you can simply to use the $host variable on the root directive and make sure this vhost is the default one.

server {

    listen 80 default_server;

    server_name _;
    root /var/www/$host;

}

The server_name can be anything but the default_server on the listen directive is important, specially if you want to use more than one vhost.

You can also overwrite this vhost like you usually do.

server {
    listen 80;
    server_name example.ngrok.io;
    root /var/www/example.com;
    # include fpm-laravel.conf;
}

If you want to take a closer look at how it works in a real setup you can check this Git repo: https://github.com/milhouse1337/vagrant-lemp

EOF