如果我有 3 个域,domain1.com、domain2.com 和 domain3.com,是否可以为未列出的域设置默认虚拟主机?例如,如果我有:
<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain1
ServerName domain1
ServerAlias host
</VirtualHost>
<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain2
ServerName domain2
ServerAlias host
</VirtualHost>
<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/everythingelse
ServerName *
ServerAlias host
</VirtualHost>
如果您注册一个域并将其指向我的服务器,它将默认显示与 domain3 相同的所有内容。那可能吗?
使用基于名称的虚拟主机时,加载的第一个虚拟主机配置将是默认配置(来源:Apache Wiki)。例如,使用下面的配置,否则不匹配的域将匹配
domain-one.com
:许多服务器没有单一的配置文件,但有几个特定于主机的配置文件,组织如下:
在这种情况下,要首先加载特定的虚拟主机配置,请将符号链接重命名为排序时将首先加载的内容,例如
00-default
.其他一些答案并不完全正确。根据 Apache Wiki,不在
ServerName
虚拟主机中设置 a是不正确的。如果ServerName
没有首先加载没有 a 的主机,Apache 甚至可能永远不会使用它,因为第一个加载的主机将是默认值。此外,虽然
ServerAlias *
确实会匹配任何东西,但它也可能会覆盖稍后定义的其他虚拟主机。如果它始终是要定义的最后一个虚拟主机(如问题中给出的配置),也许这种方法会起作用,但这意味着添加一个新指令并更改排序顺序,而不是像上面那样仅更改顺序。是的,这应该可以,除了 ServerAlias 应该是“*”,ServerName 设置为实际的主机名。您可能需要确保 VirtualHost 是最后加载的...
不要指定服务器名称,这将成为您的默认虚拟主机..
还要确保您没有在主 httpd.conf 文件中指定 DocumentRoot,因为这将优先于虚拟主机。
顺序很重要 - 将其他所有内容的虚拟主机定义移到列表的开头。
按照http://httpd.apache.org/docs/2.2/vhosts/examples.html的规定,使用 _default_ 虚拟主机并将其放在 httpd-vhosts.conf 中
“捕获对任何未指定 IP 地址和端口的每个请求,即不用于任何其他虚拟主机的地址/端口组合 [...] 默认 vhost 永远不会为发送到地址/端口的请求提供服务"
来自实时但经过混淆的 httpd-vhosts.conf 的片段,恰好将所有虚拟主机锁定到端口 80:
可以在这里找到对 vhost 匹配过程的深入解释:http ://httpd.apache.org/docs/2.2/vhosts/details.html
通配符包括您的站点配置文件:
组织您的站点 conf 文件,以便按预期顺序加载它们。例子...
01-httpd.conf
02-site1-httpd.conf
03-site2-httpd.conf
ETC...
Apache 将按顺序阅读这些内容。然后创建一个总是最后加载的,以捕获任何不匹配的虚拟主机并返回 404 而不是加载默认站点。
99-catchall-httpd.conf
请务必将这些端口替换为您的 httpd 侦听的任何端口。或者,如果您有 httpd 侦听特定接口,则需要为每个接口添加一个包罗万象,如下所示:
希望这可以帮助。我使用此方法按我指定的顺序加载站点,并防止不匹配的虚拟主机无意中加载意外站点。
最好的解决方案是重命名以“1”开头的站点配置文件,以便它首先加载,这将是您的默认站点。
Apache2 将第一个加载的 vhost 文件作为默认页面。
<VirtualHost *:port>
在为您关心的主机使用和指定 ServerName/ServerAlias 时,这是我需要做的。我的情况的一些背景:
我有一个来自我的 ISP 的动态 IP 地址,所以我的 IP 地址是在动态 IP 地址注册公司(在我的例子中是 noip.org)注册的。我的“主机”之一需要在我的 DNS 注册中注册为 myabc.example.com 作为指向 host1.ddns.net 的 CNAME。但是 host2.ddns.net 保持原样。我希望 myabc.example.com 和 host1.ddns.net 去 site1 和 host2.ddns.net 去站点 2 和其他任何东西,包括我的 IP 地址去默认。
读取的第一个 conf 文件将是默认值,即
000_def.conf
,将按该顺序读取,并001_site1.conf
作为默认站点。(注意:在我的情况下,我有这些“文件”,其中实际上是指向实际 conf 文件的动态链接)002_site2.conf
000_def.conf
/etc/apache2/sites-enabled
/etc/apache2/sites-available
因为在 001_site1.conf 和 002_site2.conf 中使用了 ServerName,所以它也必须在 000_def.conf 中设置为某个值。
除了这里给出的答案(尤其是来自@Jason Blevins 的答案)之外,这里还有一个潜在的陷阱。我花了一些时间才弄清楚这一点。
如前所述,如果没有其他条目与or指令匹配,Apache 将使用第一个VirtualHost 条目。
HostName
HostAlias
但是,当您混合绑定到特定 IP 地址的虚拟主机和一些不绑定的虚拟主机时要小心(
<VirtualHost 192.168.1.1:80>
vs.<VirtualHost *:80>
)。如果向具有一个或多个 IP 绑定虚拟主机的 IP 地址发出请求,它将使用与该地址绑定的第一个 VirtualHost 条目,即使它不是第一个。换句话说,在 IP 地址匹配中,更具体的匹配也优于非特定的匹配。
例子
如果向 host 发出请求
foobar.example.com
,并且解析为 192.168.1.1,则 Apache 将从 /www/docs/domain2 提供服务,这可能是意外的。为了解决这个问题,要么...
<VirtualHost *>
),或如果有疑问,请运行
apachectl -S
(或任何适合您系统的命令)以获取 VirtualHosts 列表。它会告诉你哪一个被用作默认值。土豚技术
在 Apache 2.4.x、Ubuntu 20.04 上,没有
httpd.conf
文件。虚拟托管站点使用 配置
/etc/apache2/sites-available/
,并使用符号链接启用/etc/apache2/sites-enabled
,我使用以下技术来解决默认主机故障。设置一个名为aardvark.aaa的虚假站点并将其映射到默认页面。它之所以有效,是因为在 Apache2 中,虚拟主机是按字母顺序加载的,而 aardvark.aaa 将是第一个。(如果您有一个名为 aaa.com 的网站,那么您就不走运了 :^)
/etc/apache2/sites-available/000-default.conf
到/etc/apache2/sites-available/aardvark.aaa.conf
.sudo cp 000-default.conf aardvark.aaa.conf
像这样配置
~/sites-available
. 这将导致网站被启用、加载并在浏览器中可见:ln -s ../sites-available/aardvark.aaa.conf
像这样在 /var/www/ 中创建一个 /var/www/aardvark/index.html 文件
$猫> index.html
你好世界
[CTRL-D]
反弹你的服务器
$ sudo systemctl 重启 apache2
确认
aardvark.aaa
先用这个命令加载$ sudo apache2ctl -S
root@ip-172-26-2-167:/etc/apache2/sites-enabled# sudo apache2ctl -S VirtualHost 配置:*:80 是 NameVirtualHost 默认服务器 aardvark.aaa (/etc/apache2/sites-enabled/aardvark .aaa.conf:1) 端口 80 namevhost aardvark.aaa (/etc/apache2/sites-enabled/aardvark.aaa.conf:1) 别名www.aardvark.aaa
浏览到您的主机/IP 地址。你应该看到:
你好世界