如何在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文件
答案 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
)按字母顺序读取它们。