如果我有 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>
如果您注册一个域名并将其指向我的服务器,则其他所有内容都会默认显示与域 3 相同的内容。这可能吗?
答案1
是的,这应该可行,但 ServerAlias 应为“*”,ServerName 应设置为实际主机名。您可能需要确保 VirtualHost 是最后加载的...
答案2
使用基于名称的虚拟主机时,第一个加载的虚拟主机配置将是默认配置(来源:Apache 维基)。例如,使用下面的配置,否则不匹配的域将与匹配domain-one.com
:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName domain-one.com
# Other options and directives ..
</VirtualHost>
<VirtualHost *:80>
ServerName domain-two.com
# Other options and directives ..
</VirtualHost>
许多服务器没有单一的配置文件,而是有几个特定于主机的配置文件,组织方式如下:
/etc/apache2
|-- sites_available (actual configuration files)
`-- sites_enabled (symlinks to files in sites_available)
在这种情况下,为了使特定的虚拟主机配置首先加载,请将符号链接重命名为排序时首先出现的名称,例如00-default
。
其他一些答案并不完全正确。根据 Apache Wiki,ServerName
没有在虚拟主机中设置是不正确的。如果没有的主机ServerName
没有首先加载,Apache 可能永远不会使用它,因为第一个加载的主机将是默认主机。
此外,虽然ServerAlias *
确实可以匹配任何内容,但它也可能覆盖稍后定义的其他虚拟主机。如果总是最后的虚拟主机需要定义(如问题中给出的配置),但这意味着添加一个新的指令和改变排序顺序,而不是像上面那样仅仅改变顺序。
答案3
不要指定服务器名称,它将成为您的默认虚拟主机。
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
还要确保您没有在主 httpd.conf 文件中指定 DocumentRoot,因为它将优先于 vhosts。
答案4
使用默认虚拟主机并将其放在 httpd-vhosts.conf 中,如http://httpd.apache.org/docs/2.2/vhosts/examples.html
“捕获对任何未指定的 IP 地址和端口的每个请求,即未用于任何其他虚拟主机的地址/端口组合 [...] 默认虚拟主机永远不会处理发送到用于基于名称的虚拟主机的地址/端口的请求。如果请求包含未知或没有 Host: 标头,则始终从基于名称的主要虚拟主机(配置文件中首先出现的该地址/端口的虚拟主机)提供服务。”
来自实时但模糊的 httpd-vhosts.conf 的代码片段恰好将所有虚拟主机锁定到端口 80:
# Listen for virtual host requests on all IP addresses.
# This directive cannot be removed:
NameVirtualHost *:80
<VirtualHost _default_:80>
# This vhost catches client requests with host headers which have
# not been matched by ServerName or ServerAlias directives in other vhosts.
#
# We redirect all such requests to a particular named vhost:
RewriteCond %{HTTP_HOST} ^(.*)$
RewriteRule ^(.*)$ http://my.site.of.choice [R=permanent,L]
</VirtualHost>
# Name based vhosts here:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName my.other.site
ServerAlias my.other.site2 my.other.site3
</VirtualHost>
# more vhosts etc...
关于 vhost 匹配过程的深入解释可以在这里找到:http://httpd.apache.org/docs/2.2/vhosts/details.html