Search code examples
apachevirtualhost

Order to declare VirtualHost for domain and subdomains, Apache2, Ubuntu


I declared in my DNS, my domain, subdomain1 and subdomain2, and everything works.

Then I create my directories like this : /var/www/domain.com/public_html/index.html /var/www/subdomain1.domain.com/public_html/index.html /var/www/subdomain2.domain.com/public_html/index.html

Then I create : /etc/apache2/sites-available/domain.conf

NameVirtualHost *:80

<VirtualHost *:80>
        ServerName www.subdomain1.domain.com
        ServerAlias www.subdomain1.domain.com
        ServerAdmin webmaster@domain.com
        DocumentRoot /var/www/subdomain1.domain.com/public_html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>
        ServerName www.subdomain2.domain.com
        ServerAlias www.subdomain2.domain.com
        ServerAdmin webmaster@domain.com
        DocumentRoot /var/www/subdomain2.domain.com/public_html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerName www.domain.com
    ServerAlias www.domain.com
    ServerAdmin webmaster@domain.com
    DocumentRoot /var/www/domain.com/public_html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

I disable the default configuration: sudo a2dissite 000-default.conf

Then I activate each of the websites: sudo a2ensite domain.conf

I restart Apache 2: sudo systemctl restart apache2.service

The problem is that all links point to the first declared VirtualHost, even when I separate the VirtualHost declarations in separate .conf files, it will always be the first VirtualHost in the directory that will be opened for all DNS domains.


Solution

  • Apache will try to match the requested domain to one of the VirtualHost it knows about. When it cannot find a match, it will use the first one it read, top to bottom in the configurations. Hence here, your domains are not being recognized by Apache, and you get the first one all the time.

    I modified your configuration a little bit:

    NameVirtualHost *:80
    
    <VirtualHost *:80>
            ServerName www.subdomain1.example.com
            ServerAlias subdomain1.example.com
            ServerAdmin webmaster@example.com
            DocumentRoot /var/www/subdomain1.example.com/public_html
    
            ErrorLog ${APACHE_LOG_DIR}/sub1_error.log
            CustomLog ${APACHE_LOG_DIR}/sub1_access.log combined
    </VirtualHost>
    
    <VirtualHost *:80>
            ServerName www.subdomain2.example.com
            ServerAlias subdomain2.example.com
            ServerAdmin webmaster@example.com
            DocumentRoot /var/www/subdomain2.example.com/public_html
    
            ErrorLog ${APACHE_LOG_DIR}/sub2_error.log
            CustomLog ${APACHE_LOG_DIR}/sub2_access.log combined
    </VirtualHost>
    
    <VirtualHost *:80>
        ServerName www.example.com
        ServerAlias example.com
        ServerAdmin webmaster@example.com
        DocumentRoot /var/www/example.com/public_html
    
        ErrorLog ${APACHE_LOG_DIR}/example_error.log
        CustomLog ${APACHE_LOG_DIR}/example_access.log combined
    </VirtualHost>
    

    Details:

    • NameVirtualHost is only required if you run Apache 2.2. >2.4, it is automatic, no need to put it, it will work anyway.
    • ServerAlias is useful to define another domain name that applies to this VirtualHost. If you define ServerAlias == ServerName, it is useless.
    • Therefore, the ServerAlias are now configured with the domain names, without "www."
    • Split your log files. If you have 3 VH pointing to the same logs, it will be a real mess to debug. It makes it easier when split.

    So with this configuration...

    • http://www.subdomain1.example.com and http://subdomain1.example.com will go to the 1st VH.
    • Similar for subdomain2
    • And http://www.example.com and http://example.com will use the third one.

    This is based on your question and the comment where you say you tried example.com. In your configuration, example.com was not listed anywhere (i.e. www.example.com != example.com).