Apache默认VirtualHost

时间:2011-03-25 00:52:01

标签: apache virtualhost

如何在apache中设置默认的VirtualHost? 我希望默认主机不要与ip地址主机相同。现在我有这样的事情:

NameVirtualHost *

<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 *>

如果域转发到我的服务器,但不在此vhost.conf文件中,则会按预期加载/ someOtherDir /中的文件。但我希望能够为ip-address本身和未添加到vhost.conf文件中的域使用不同的根(尚未)。这可能吗?

编辑:纠正了我的代码,所以它看起来更像实际的vhost.conf文件

9 个答案:

答案 0 :(得分:45)

我找到了答案:我记得如果找不到其他匹配块,Apache会使用第一个块,所以我在块的顶部添加了一个没有serveralias的块:

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>

答案 1 :(得分:8)

如果您使用的是Debian风格的虚拟主机配置(sites-available / sites-enabled),设置Default VirtualHost的一种方法是首先在httpd.conf或apache.conf中包含特定的配置文件(或者什么都是您的主要配置文件)。

# To set default VirtualHost, include it before anything else.
IncludeOptional sites-enabled/my.site.com.conf

# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf

# Load virtual host config files from "/etc/httpd/sites-enabled/".
IncludeOptional sites-enabled/*.conf

答案 2 :(得分:3)

我会说什么对我有用,上面的其他回答对我的情况完全没有帮助。我希望它可以帮助某人。

实际上,我在具有Apache / 2.4.39(Amazon)的EC2 Linux AMI上使用虚拟主机配置(可用站点/启用站点)。因此,我有1个ec2实例可以服务许多站点(域)。

考虑到您已经安装了虚拟主机并且可以正常工作。在我的文件夹/ etc / httpd / sites-available中,我有一些带有域名(后缀.conf)的文件,例如:domain.com.conf。像这样创建一个新文件。

  

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

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

对于站点中可用的每个file.conf,我创建一个符号链接:

  

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

这是默认配置,因此,如果通过服务器IP直接访问,您将被重定向到站点可用文件夹中按文件名排序的第一个文件(.conf)的DocumentRoot。

要通过IP访问时具有默认DocumentRoot文件夹,您必须创建一个名为0a.conf的文件,然后apache将为该站点提供服务,因为此新文件将是站点中第一个可用的文件文件夹。

您必须创建一个符号链接:

  

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

要检查服务订单,请使用它:

  

sudo apachectl -S

现在,重新启动apache,然后签出。

开心=)

答案 3 :(得分:2)

另一种设置是将默认虚拟主机放在配置文件的末尾而不是开头。这样,在默认虚拟主机匹配之前,将检查所有备用虚拟主机。

示例:

NameVirtualHost *:80
Listen 80

...

<VirtualHost *:80>
        ServerName host1
        DocumentRoot /someDir
</VirtualHost>

<VirtualHost *:80>
        ServerName host2
        DocumentRoot /someOtherDir
</VirtualHost>

<VirtualHost *:80>
        DocumentRoot /defaultDir
</VirtualHost>

答案 4 :(得分:2)

这里的其他答案对我不起作用,但我找到了一个非常简单的解决方案,确实有效。

我将默认值设为列出的最后一个,然后我给了它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>

例如:

secondwebsite.com

如果访问者没有明确选择转到以GetProcAddress结尾的内容,则会获得默认网站。

答案 5 :(得分:1)

必填-以上都不对我有用。我继承了由ISPConfig弄乱的Apache配置中基于ip的虚拟主机和基于* vhost(未分配/捕获所有ip)的虚拟主机的奇怪组合。

我希望Apache为未配置的主机提供同一页面。 我当时遇到的-未配置的主机在000-default.conf之后进入了第一个虚拟主机。无论我是否*:80都将所有定义为第一个虚拟主机,而不是默认情况下,Apache会加载第一个定义的站点:

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

尽管它不是完全有效的配置,但最终的工作是添加未定义ServerName / ServerAlias的基于IP的虚拟主机:

<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首先输出基于ip的虚拟主机,然后输出基于*的虚拟主机,最后我的默认站点在真实站点之前被加载:

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)

注意事项-在这样的配置中,*虚拟主机不起作用,因此您需要将IP应用于所有虚拟主机。

答案 6 :(得分:0)

NameVirtualHost选项将是一个不错的选择。

答案 7 :(得分:0)

我有同样的问题。我可以通过在虚拟主机的IncludeOptional指令之前在httpd.conf本身中添加以下内容来修复它。现在,localhost和IP 192.168.x.x都指向Apache的默认测试页。所有其他虚拟主机均按预期工作。

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

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

答案 8 :(得分:-1)

解决方案是:

NameVirtualHost *:80
Listen 80

(...)

<VirtualHost *:80>
        ServerName host1
        DocumentRoot /someDir
</VirtualHost>

<VirtualHost *:80>
        ServerName host2
        DocumentRoot /someOtherDir
</VirtualHost>

<VirtualHost *:80>
        ServerName aaaa.com
        DocumentRoot /defaultDir
</VirtualHost>

在我的情况下,要工作,我创建了一个VirtualHost的{​​{1}}(每个VirtualHost每一个CNAME(ne aaaa.com),因为我为不同的{{1}并且知道VirtualHost(不存在apache2)按字母顺序读取它们。