Apache 默认虚拟主机
Posted
技术标签:
【中文标题】Apache 默认虚拟主机【英文标题】:Apache default VirtualHost 【发布时间】:2011-07-22 14:14:01 【问题描述】:如何在 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 地址本身和尚未添加到 vhost.conf 文件中的域使用不同的根。这可能吗?
【问题讨论】:
【参考方案1】:我找到了答案:我记得如果没有找到其他匹配的块,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>
【讨论】:
实际上 - 我必须将ServerName fake.example.com
添加到“默认”虚拟主机中。
文件的顺序发生了变化(按字母顺序排序),所以我的默认设置突然停止工作。我建议将配置放在000-default.conf
文件中。
在我将端口号设置为 80 之前没有为我工作。即。 如果您使用的是 Debian 风格的虚拟主机配置(站点可用/站点启用),设置默认虚拟主机的一种方法是首先在 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
【讨论】:
【参考方案3】:这里的其他答案对我不起作用,但我找到了一个非常简单的解决方案。
我将默认的设置为列出的最后一个,我给了它ServerAlias *
。
例如:
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
结尾的内容,他们将获得默认网站。
【讨论】:
请注意,通配符别名不会使主机成为默认主机。默认仍然是定义的第一个主机,它有副作用。例如,如果第一个主机使用 SSLStrictSNIVHostCheck,那么这将适用于所有主机,这是令人惊讶的。最好定义一个假主机,确保它是第一个,因此它将成为默认值,然后使用通配符别名,必须最后定义,用于您要处理任何不匹配的主机。【参考方案4】:我会说什么对我有用,上面的其他答案对我的情况根本没有帮助。我希望它可以帮助某人。
实际上,我在带有 Apache/2.4.39(亚马逊)的 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>
对于sites-available 中的每个file.conf,我创建了一个符号链接:
sudo ln -s /etc/httpd/sites-available/domain.com.conf /etc/httpd/sites-enabled/domain.com.conf
这是默认配置,所以如果直接通过服务器的IP访问,你将被重定向到sites-available文件夹中第一个文件(.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,然后检查一下。
要开心=)
【讨论】:
在启用站点和可用站点之间创建/删除符号链接由从软件包安装时与 apache 一起安装的实用程序负责。sudo a2ensite your_domain.conf
将在启用站点(从而启用虚拟主机)中创建符号链接,sudo a2dissite your_domain.conf
将删除符号链接(从而禁用虚拟主机)【参考方案5】:
必填 - 以前的答案都不适合我。在这个被ISPConfig弄乱的Apache配置中,我继承了基于IP地址的虚拟主机和基于虚拟主机(未分配/捕获所有IP地址)的虚拟主机的奇怪组合。
我希望 Apache 为未配置的主机提供相同的页面。
我有:未配置的主机转到000-default.conf
之后的第一个虚拟主机。不管我有 *:80 捕获所有定义为第一个虚拟主机,而不是默认的 Apache 将加载第一个定义的站点:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
</VirtualHost>
虽然它不是完全有效的配置,但最终起作用的是添加一个基于 IP 地址的虚拟主机,而没有定义 ServerName/ServerAlias:
<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地址的vhosts,然后输出基于*的vhosts,最后我的默认站点在真实站点之前被加载:
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)
注意事项 - 在这样的配置中,* vhosts 将无法工作,因此您需要将 IP 地址应用到所有 vhosts。
【讨论】:
【参考方案6】:另一种设置是将默认虚拟主机放在配置文件的末尾而不是开头。这样,所有备用虚拟主机都会在被默认虚拟主机匹配之前进行检查。
例子:
NameVirtualHost *:80
Listen 80
...
<VirtualHost *:80>
ServerName host1
DocumentRoot /someDir
</VirtualHost>
<VirtualHost *:80>
ServerName host2
DocumentRoot /someOtherDir
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /defaultDir
</VirtualHost>
【讨论】:
根据wiki.apache.org/httpd/…。这是一种常见的错误配置,不会起作用。【参考方案7】:我遇到了同样的问题。我可以通过在虚拟主机的 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】:NameVirtualHost 选项将是一个不错的选择。
【讨论】:
你能举个例子吗?我已经在本文档的顶部有 NameVirtualHost * 行。如果我想要一个默认页面,我需要如何更改它? 你能扩展你的答案吗? editing your answer(没有“编辑:”、“更新:”或类似的 - 答案应该看起来好像是今天写的)。【参考方案9】:解决办法是:
# apache2.conf
# @warning this is specific to apache 2.2
NameVirtualHost *:80
Listen 80
# ...
# aaaa.com.conf
<VirtualHost *:80>
ServerName aaaa.com
DocumentRoot /defaultDir
</VirtualHost>
# host1.conf
<VirtualHost *:80>
ServerName host1
DocumentRoot /someDir
</VirtualHost>
# host2.conf
<VirtualHost *:80>
ServerName host2
DocumentRoot /someOtherDir
</VirtualHost>
在我的情况下,为了工作,我创建了一个名为 CNAME
的 VirtualHost
(每个 CNAME
的 VirtualHost
),因为我有不同的文件用于不同的 VirtualHost
s,并且知道 Apache 按字母顺序读取它们.
【讨论】:
什么是缩写。 “n.e.”? @Cocfay 而不是使用像aaaa.com.conf
这样的文件名,您应该坚持使用默认的000-default.conf
,它应该是 99.99% 的 alpha 顺序中的第一个文件以上是关于Apache 默认虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章