13

I have an Apache2 configuration with multiple VirtualHosts. My DNS is set to accept *.<domain>.<tld> on multiple domains. Everything is working correctly but if I go to something-random-here.example.com I seem to get an invalid VirtualHost being selected (I am guessing the first or last one it finds). Is there a way to tell Apache to use certain rules if none of the VirtualHost entries match the domain or subdomain? I'd preferably like to return a 404.

3 Answers 3

12

Apache uses the first virtualhost if no name matches. Just configure a new virtualhost as the first one with a random name, displaying whatever you like - or returning a 404 page.

4
  • 1
    Thanks but could you please elaborate? I can't get this to work.
    – Mr Fox
    Sep 7, 2011 at 12:34
  • 2
    How are your apache2 configuration files layed out? Or which operating system do you use? Apache reads the configuration in a certain order, and the first VirtualHost it sees is the default one. It receives all traffic from unknown host names. So if you have a single configuration file, the first VirtualHost is it. If you have multiple ones, like on most linuxes, it may be the one called 0default or so... Sep 7, 2011 at 15:00
  • I put some default configurations in the ports.conf. It wasn't working because I tried to match *:80 when I was using <ip>:80 on my virtualhosts. Instead I had to create a separate default entry for each IP and it works now.
    – Mr Fox
    Sep 8, 2011 at 15:31
  • Neither my first or last v-host file is used. I think apache has changed.
    – Cobolt
    Jun 18, 2019 at 15:55
5

Wildcard include your site configuration files:

Include path/to/site/confs/*httpd.conf

Organize your site conf files so they are loaded in an expected order. Example...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

etc...

Apache will read these in order. Then create one that will always load last to catch any unmatched virtual hosts and return a 404 instead of loading a default site.

99-catchall-httpd.conf

<VirtualHost *:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost *:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Be sure to replace the ports with whatever ports your httpd listens on. Or if you have httpd listening on specific interfaces, you'll need to add a catchall for each interface instead, like so:

<VirtualHost 192.168.1.101:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>
<VirtualHost 192.168.1.101:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Hope this helps. I use this method to load sites in the order I specify and prevent unmatched virtual hosts from loading an unexpected site unintentionally.

3
  • isn't "ServerAlias *" should be removed from catch-all rules?
    – Ahm3d Said
    Jul 21, 2019 at 13:09
  • I suppose it wouldn't matter. If none of the virtual hosts prior to the catchall handle the request, these will return a 404 response. I don't see a reason that ServerAlias * would have to be removed, but they may be unnecessarily specific. Jul 23, 2019 at 19:51
  • It doesn't work. Apache is reading site configuration in random order.
    – QkiZ
    Nov 1, 2023 at 7:58
0

As Moritz Both mentions, Apache2 will use the first virtual host it finds if it does not match any that you have requested.

When you first install Apache2 there's a default website conf that you can use as a template, modify or delete, and I was always wondering what the 000-default.conf was actually for, because they had a default.conf too. After reading what Moritz Both said, it all makes more sense now.

What I did for my server was copy the config for the default hostname (website) to 000-default.conf file and a2ensite 000-default.

Now, everytime there is an unmatched domain request to my website, it serves up the 000-default page, which is just a copy of my actual default page.

3
  • 1
    I do the same but my un-matched/default host sends a redirect to the proper top level site which changes the displayed URL to the correct one as well.
    – ivanivan
    Dec 25, 2018 at 13:55
  • That is a really great idea! I didn't think about that. I will definitely be implementing my site like that :) Dec 25, 2018 at 18:18
  • For some reason, I can't seem to get my ssl (default page) to redirect. I have <VirtualHost *:443> ... Redirect / https://baseurl/ ... </VirtualHost> but the url stays the same. I've done the same for the non ssl version and it redirects correctly. Any ideas? Dec 25, 2018 at 19:31

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .