Apache default VirtualHost

前端 未结 9 1624
忘掉有多难
忘掉有多难 2020-12-05 17:53

how can I set a default VirtualHost in apache? Preferably, I want the default host not to be the same as the ip address host. Now I have something like this:



        
相关标签:
9条回答
  • 2020-12-05 17:53

    I will say what worked for me, the others answers above didn't help to my case at all. I hope it can help someone.

    Actually, I'm using Virtual host configuration (sites-available / sites-enabled) on EC2 Linux AMI with Apache/2.4.39 (Amazon). So, I have 1 ec2 instance to serve many sites (domains).

    Considering that you already have Virtual Host installed and working. In my folder /etc/httpd/sites-available, I have some files with domain names (suffix .conf), for example: domain.com.conf. Create a new file like that.

    sudo nano /etc/httpd/sites-available/domain.com.conf

    <VirtualHost *:80>
        ServerName www.domain.com
        ServerAlias domain.com
        DocumentRoot /var/www/html/domain
    </VirtualHost>
    

    For each file.conf in sites-available, I create a symbolic link:

    sudo ln -s /etc/httpd/sites-available/domain.com.conf /etc/httpd/sites-enabled/domain.com.conf

    This is the default configuration, so, if access directly by IP of Server, you will be redirect to DocumentRoot of the first file (.conf) in sites-available folder, sorted by filename.

    To have a default DocumentRoot folder when access by IP, you have to create a file named 0a.conf, then apache will serve this site because this new file will be the first in sites-available folder.

    You must create a symbolic link:

    sudo ln -s /etc/httpd/sites-available/0a.conf /etc/httpd/sites-enabled/0a.conf

    To check serving order, use it:

    sudo apachectl -S

    Now, restart apache, and check out it.

    Be happy =)

    0 讨论(0)
  • 2020-12-05 17:55

    I found the answer: I remembered that Apache uses the first block if no other matching block is found, so I've added a block without a serveralias at the top of the blocks:

    NameVirtualHost *
    
    <VirtualHost *>
    DocumentRoot /defaultdir/
    </VirtualHost>
    
    <VirtualHost *>
    ServerAdmin admin@domain.com
    DocumentRoot /someOtherDir/
    ServerAlias ip.of.the.server
    </VirtualHost>
    
    <VirtualHost *>
    ServerAdmin admin@domain.com
    DocumentRoot /someroot/
    ServerAlias domain.com *.domain.com
    </VirtualHost>
    
    0 讨论(0)
  • 2020-12-05 17:58

    Obligatory - none of the above worked for me. I inherited strange combination of ip based virtual hosts and * vhosts (not assigned/catch all ips) based virtual hosts in this Apache config messed by ISPConfig.

    I wanted Apache to serve not configured hosts with same page. What I had was - not configured hosts went to first vhost after 000-default.conf. No matter I had *:80 catch all defined as first vhost, instead of default Apache would load first defined site:

    <VirtualHost *:80>
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/html
    </VirtualHost>
    

    Although it's not completely valid config, what finally worked was adding ip based virtualhost without ServerName/ServerAlias defined:

    <VirtualHost 192.168.10.10:80>
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/html
    </VirtualHost>
    <VirtualHost 192.168.10.10:443>
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/html
            SSLEngine On
            ...
    </VirtualHost>
    

    $ apachectl -S outputs ip based vhosts first, and * based vhosts later, and finally my default site is loaded before real site:

    AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/sites-enabled/000-default.conf:50
    192.168.10.10:80        is a NameVirtualHost
             default server server.tld (/etc/apache2/sites-enabled/000-default.conf:34)
             port 80 namevhost server.tld (/etc/apache2/sites-enabled/000-default.conf:34)
             port 80 namevhost some-site.tld (/etc/apache2/sites-enabled/100-some-site.tld.vhost:7)
    
    ...
    
    46.23.86.103:443       is a NameVirtualHost
             default server server.tld (/etc/apache2/sites-enabled/000-default.conf:38)
             port 443 namevhost server.tld (/etc/apache2/sites-enabled/000-default.conf:38)
             port 443 namevhost some-site.tld (/etc/apache2/sites-enabled/100-some-site.tld.vhost:182)
    
    ...
    
    *:80                   is a NameVirtualHost
             default server server.tld (/etc/apache2/sites-enabled/000-default.conf:1)
             port 80 namevhost server.tld (/etc/apache2/sites-enabled/000-default.conf:1)
    

    Word of notice - in config like this, * vhosts won't work, so you need to apply ip's to all vhosts.

    0 讨论(0)
  • 2020-12-05 17:58

    An alternative setting is to have the default virtual host at the end of the config file rather than the beginning. This way, all alternative virtual hosts will be checked before being matched by the default virtual host.

    Example:

    NameVirtualHost *:80
    Listen 80
    
    ...
    
    <VirtualHost *:80>
            ServerName host1
            DocumentRoot /someDir
    </VirtualHost>
    
    <VirtualHost *:80>
            ServerName host2
            DocumentRoot /someOtherDir
    </VirtualHost>
    
    <VirtualHost *:80>
            DocumentRoot /defaultDir
    </VirtualHost>
    
    0 讨论(0)
  • 2020-12-05 17:58

    I had the same issue. I could fix it by adding the following in httpd.conf itself before the IncludeOptional directives for virtual hosts. Now localhost and the IP 192.168.x.x both points to the default test page of Apache. All other virtual hosts are working as expected.

    <VirtualHost *:80>
        DocumentRoot /var/www/html
    </VirtualHost>
    

    Reference: https://httpd.apache.org/docs/2.4/vhosts/name-based.html#defaultvhost

    0 讨论(0)
  • 2020-12-05 18:07

    The other answers here didn't work for me, but I found a pretty simple solution that did work.

    I made the default one the last one listed, and I gave it ServerAlias *.

    For example:

    NameVirtualHost *:80
    
    <VirtualHost *:80>
        ServerName www.secondwebsite.com
        ServerAlias secondwebsite.com *.secondwebsite.com
        DocumentRoot /home/secondwebsite/web
    </VirtualHost>
    
    <VirtualHost *:80>
        ServerName www.defaultwebsite.com
        ServerAlias *
        DocumentRoot /home/defaultwebsite/web
    </VirtualHost>
    

    If the visitor didn't explicitly choose to go to something ending in secondwebsite.com, they get the default website.

    0 讨论(0)
提交回复
热议问题