Apache 默认/Catch-All 虚拟主机?

Apache 默认/Catch-All 虚拟主机?

如果我有 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

相关内容