How to Fix Apache VirtualHost Overlap on Port 80 and Resolve Domain Routing Issues


3 views

When configuring multiple VirtualHosts in Apache on the same port (typically port 80), you might encounter this warning:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

This occurs when Apache can't properly distinguish between different virtual hosts listening on the same IP-port combination. The symptom you're seeing - where all domains route to the first VirtualHost - confirms the configuration isn't working as intended.

The solution you found (uncommenting NameVirtualHost *:80) is correct for older Apache versions (2.2.x and earlier). However, in newer Apache versions (2.4.x), this directive is deprecated as name-based virtual hosting is enabled by default.

Your configuration appears correct, but let's examine a complete working example:

# Ensure this is in your main apache config (httpd.conf or apache2.conf)
Listen 80

<VirtualHost *:80>
    DocumentRoot /var/www/html/site1
    ServerName www.site1.com
    ServerAlias site1.com
    # Additional directives...
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/html/site2
    ServerName www.site2.com
    ServerAlias site2.com
    # Additional directives...
</VirtualHost>

After making changes, always:

  1. Check configuration syntax: apachectl configtest
  2. Restart Apache: systemctl restart apache2 (or service httpd restart on CentOS)
  3. Verify using: curl -v http://www.site1.com and curl -v http://www.site2.com

If domains still route to the wrong site:

  • Clear browser cache or use incognito mode
  • Check /etc/hosts file if testing locally
  • Verify DNS records point to your server
  • Ensure no conflicting .htaccess files

For CentOS 5 specifically, you might need additional steps:

# In /etc/httpd/conf/httpd.conf
NameVirtualHost *:80

# Then in /etc/httpd/conf.d/vhosts.conf
<VirtualHost *:80>
    DocumentRoot /var/www/html/site1
    ServerName www.site1.com
    ServerAlias site1.com
    ErrorLog /var/log/httpd/site1_error.log
    CustomLog /var/log/httpd/site1_access.log combined
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/html/site2
    ServerName www.site2.com
    ServerAlias site2.com
    ErrorLog /var/log/httpd/site2_error.log
    CustomLog /var/log/httpd/site2_access.log combined
</VirtualHost>

For production environments:

  • Consider using separate IP addresses for critical sites
  • Implement SSL certificates (which naturally separate hosts via SNI)
  • Set up proper logging for each virtual host
  • Use <Directory> directives for security

When configuring multiple VirtualHosts in Apache, you might encounter the warning:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

This typically occurs when:

  • Multiple VirtualHosts are defined for the same IP/port combination
  • The NameVirtualHost directive isn't properly configured
  • There's no default VirtualHost catch-all

Here's the proper way to set up multiple VirtualHosts on port 80:

# Essential directive for name-based virtual hosting
NameVirtualHost *:80

# Default catch-all VirtualHost (should come FIRST)

    DocumentRoot /var/www/default
    ServerName default.example.com


# First site configuration

    ServerName www.site1.com
    ServerAlias site1.com
    DocumentRoot /var/www/html/site1
    ErrorLog ${APACHE_LOG_DIR}/site1_error.log
    CustomLog ${APACHE_LOG_DIR}/site1_access.log combined
    
    # Additional directives
    
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    


# Second site configuration

    ServerName www.site2.com
    ServerAlias site2.com
    DocumentRoot /var/www/html/site2
    ErrorLog ${APACHE_LOG_DIR}/site2_error.log
    CustomLog ${APACHE_LOG_DIR}/site2_access.log combined
    
    
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    
  1. The NameVirtualHost *:80 directive must appear before any VirtualHost blocks
  2. The first VirtualHost block acts as the default for requests that don't match any ServerName/ServerAlias
  3. Each VirtualHost must have a unique ServerName (ServerAlias can be shared if needed)
  4. Always restart Apache after configuration changes: sudo systemctl restart apache2

If you're still experiencing issues, try these diagnostic commands:

# Check Apache configuration syntax
apachectl configtest

# View loaded VirtualHost configurations
apachectl -S

# Verify name resolution
nslookup www.site1.com
nslookup www.site2.com

For production environments, consider these additional measures:

  • Implement separate log files for each VirtualHost
  • Set up proper directory permissions
  • Configure SSL certificates for HTTPS support
  • Use directives for modular configurations