Apache 默认/全能虚拟主机?

SJa*_*r13 68 virtualhost apache-2.2

如果我有 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>
Run Code Online (Sandbox Code Playgroud)

如果您注册一个域并将其指向我的服务器,它将默认显示与域 3 相同的所有其他内容。那可能吗?

小智 91

使用基于名称的虚拟主机时,加载的第一个虚拟主机配置将是默认值(来源:Apache Wiki)。例如,使用下面的配置,否则不匹配的域将匹配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>
Run Code Online (Sandbox Code Playgroud)

许多服务器没有单一的配置文件,但有几个特定于主机的配置文件,组织如下:

/etc/apache2
|-- sites_available  (actual configuration files)
`-- sites_enabled    (symlinks to files in sites_available)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,要首先加载特定的虚拟主机配置,请将符号链接重命名为排序时最先出现的内容,例如00-default.


其他一些答案并不完全正确。根据 Apache Wiki,不在ServerName虚拟主机中设置 a是不正确的。如果ServerName没有首先加载没有 a 的主机,Apache 甚至可能永远不会使用它,因为第一个加载的主机将是默认的。

此外,虽然ServerAlias *确实会匹配任何内容,但它也可能会覆盖稍后定义的其他虚拟主机。如果它始终是要定义的最后一个虚拟主机(如问题中给出的配置),则这种方法可能会起作用,但这意味着添加新指令更改排序顺序,而不是仅更改上述顺序。

  • + 先生,您有 100 万个互联网!它必须是第一个才能默认。 (3认同)
  • “加载的第一个虚拟主机配置将是默认配置”解决了我在 XAMPP (Windows) 上使用本地 SSL 域的问题。看起来 Apache 使用第一个 vhost 作为每个端口的默认值,因此为了正确处理不安全/安全请求的不匹配域,应该有 2 个显式的“默认”配置,用于在开头定义的 80/443 端口httpd-vhosts.conf` (2认同)

fre*_*eit 44

是的,这应该可以工作,除了 ServerAlias 应该是“*”,并且 ServerName 设置为实际的主机名。您可能需要确保 VirtualHost 是最后加载的...

  • 您是否将其设置为“ServerName 主机”和“ServerAlias *”?本来我没有强调足够,但是 ServerName 不带通配符,只有 ServerAlias 可以。ServerName 需要是实际的主机名。 (2认同)

Vid*_*her 7

不要指定服务器名称,这将成为您的默认虚拟主机..

<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> 
Run Code Online (Sandbox Code Playgroud)

还要确保您没有在主 httpd.conf 文件中指定 DocumentRoot,因为这将优先于 vhost。

  • 我不同意。我的第一个虚拟主机设置没有 ServerName,但是,它似乎与某些虚拟主机冲突,但与其他虚拟主机不冲突。我通过添加 ServerName 解决了该问题,但将其设置为某个不在我的服务器上的随机域。因为它是第一个虚拟主机,所以它被用作默认值,但仅在使用与任何其他 ServerName 不匹配的域时才匹配。 (2认同)