VirtualHost always returns default host with Apache on Ubuntu 14.04

Simon picture Simon · May 17, 2014 · Viewed 61.1k times · Source

I try to setup a virtual host besides the default localhost. Whenever I try to call my virtual host http://test I get the default Apache2 Index file that sits in the directory of http://localhost. Furthermore apache returns this page still after disabling (a2dissite) both VirtualHost files an reloading apache (service apache2 reload).

What could go wrong that the virtual host is not working?

Configuration:

My directory structure is the following:

/var/www/html                  # Default localhost dir
/var/www/html7index.html       # Apache2 default index

/var/www/test                  # HTML dir for the virtual host
/var/www/test/index.html       # My "website" 

Content of /etc/hosts:

127.0.0.1       localhost
127.0.1.1       Laptop
127.0.0.1       test

Directory content of /etc/apache2/sites-available:

000-default.conf
default-ssl.conf
test.conf

File 000-default.conf:

<VirtualHost localhost:80>
        ServerName localhost
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

File test.conf:

<VirtualHost test:80>
        ServerAdmin test@localhost
        ServerName test
        NameVirtualHost test
        ServerAlias test
        DocumentRoot /var/www/test
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Answer

Eduardo Dennis picture Eduardo Dennis · Sep 12, 2014

I was facing this issue, and it turned out I had to disable the default virtual host.

sudo a2dissite 000-default.conf

Possible Expanation:

According to the apache documentation An In-Depth Discussion of Virtual Host Matching:

[...] If the main server has no ServerName at this point, then the hostname of the machine that httpd is running on is used instead.

That means if the default vhost (commonly 000-default.conf) has no ServerName set - which is the default - Apache will fallback to the hostname of the operating system.

As a result, Apache selects and serves from the default vhost (000-default.conf) even though another user-created vhost with the same ServerName as the machine's hostname is configured.

The reason is that Apache sorts the vhosts alphabetically by filename and chooses the first vhost configuration that matches the requested HTTP Host header. Thus, the 000-default.conf is checked before user-defined vhosts, as they are usually not prefixed with 000-.