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.

Reply via email to