VirtualHost always returns default host with Apache on Ubuntu 14.04

tl;dr: Call it with sudo: sudo service apache2 reload


Looks like the behaviour of service apache2 reload fooled me. See the following log:

user@Laptop:/etc/apache2/sites-available$ sudo a2ensite test.conf 
Enabling site test.
To activate the new configuration, you need to run:
  service apache2 reload
user@Laptop:/etc/apache2/sites-available$ service apache2 reload
 * Reloading web server apache2                                                  * 
user@Laptop:/etc/apache2/sites-available$

Try to reach http://test: NOT working

user@Laptop:/etc/apache2/sites-available$ sudo service apache2 reload
 * Reloading web server apache2                                                  * 
user@Laptop:/etc/apache2/sites-available$

Try to reach http://test: WORKING

So, find the difference! The point is that I thought it would've reloaded correctly in the first place. There are no entries in the log files either. Calling it with sudo helped. Is this a bug?


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-.