I am in the process of migrating some sites from a server running Apache 2.4.7 to a new installation (Ubuntu 18) running Apache 2.4.29 and running into some issues with VirtualHost matching.
On my old server I have a config like this:
<VirtualHost
12.34.56.78:80>
ServerAlias *.
dev.example.com VirtualDocumentRoot /var/www/dev/%1
</VirtualHost>
<VirtualHost
12.34.56.78:80>
ServerName
example.com ServerAlias
www.example.com DocumentRoot /var/www/example/
</VirtualHost>
As you can see, the ServerName directive is intentionally absent from the first host which uses a VirtualDocumentRoot to serve directories based on the subdomain. This has been working fine on the old server.
In my new environment everything worked fine at first, but today (no updates, nothing changed), oddly things changed. For some reason apache started matching
example.com to the first vhost and after some amount of debugging I have determined that this is due to the lack of ServerName directive. When I add one - anything really - the problem goes away. So to be clear, a working config now looks like this:
<VirtualHost
12.34.56.78:80>
ServerName
anything.dev.example.com ServerAlias *.
dev.example.com VirtualDocumentRoot /var/www/dev/%1
</VirtualHost>
<VirtualHost
12.34.56.78:80>
ServerName
example.com ServerAlias
www.example.com DocumentRoot /var/www/example/
</VirtualHost>
The apache docs have this to say about omitting the ServerName directive:
If you omit the ServerName directive from any name-based virtual host, the server will default to a fully qualified domain name (FQDN) derived from the system hostname.
My system hostname is something like
servername.example.com - which shouldn't match
example.com.
My question:
Has there been some change in Apache's behaviour with this newer version that would break my previous configuration? I'm looking for an explanation about why this worked fine in the old environment and now suddenly does not. I'm also looking for any explanation at all about why Apache would be matching my first vhost when ServerName is absent.