Apache默认/全部捕获虚拟主机?


67

如果我有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相同的所有内容。那可能吗?

Answers:


45

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


它应该可以,但是不能。如果未明确列出域,则会显示“ Firefox找不到服务器”。
SJaguar09年

2
您是否将其设置为“ ServerName host”和“ ServerAlias *”?我最初并未对此进行足够的强调,但是ServerName不会使用通配符,只有ServerAlias会使用通配符。ServerName必须是实际的主机名。
自由报

另外,其他虚拟主机也可以工作吗?哪个版本的apache?
自由报

“ Firefox无法找到服务器。” 不是apache的问题。您需要更多细节(联系了什么服务器,错误代码是什么...)
Law29 2015年

很奇怪,这对我不起作用,它总是选择第一个虚拟主机,而不管主机头是什么
jjxtra

80

使用基于名称的虚拟主机时,将首先加载默认的虚拟主机配置(来源: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>

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

/etc/apache2
|-- sites_available  (actual configuration files)
`-- sites_enabled    (symlinks to files in sites_available)

在这种情况下,要首先加载特定的虚拟主机配置,请将符号链接重命名为排序时将首先显示的名称00-default


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

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


主席先生,还有100万个互联网!它必须是第一个默认值。
瑞安

您知道第一个是httpd.conf还是conf.d / xyz.conf?
Esa Varemo 2012年

2
“将首先加载默认的虚拟主机配置作为默认设置”,这解决了XAMPP(Windows)上本地SSL域的问题。看来Apache会将每个端口的第一个虚拟主机用作默认端口,因此,为了正确处理不安全/不安全请求的不匹配域,应在以下两个位置为80/443端口定义2个显式“默认”配置httpd-vhosts.conf
Wirone

1
@EsaVaremo-将首先加载httpd.conf,它将包含一个包含conf.d / xyz.conf(或可能的conf.d / *)源代码的行。包含行之前的任何配置(包括虚拟主机)将首先被处理;在包含文件之后处理包含行之后的所有内容。
丹·普里兹

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> 

另外,请确保未在主httpd.conf文件中指定DocumentRoot,因为它将优先于虚拟主机。


我已将其作为列出的第一台虚拟主机,但仍然得到“ Firefox无法找到服务器”的信息。
SJaguar09年

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

3

顺序很重要-将虚拟主机定义的其他所有内容移到列表的开头。


2

使用_default_虚拟主机,然后按照http://httpd.apache.org/docs/2.2/vhosts/examples.html中的指定将其首先放置在httpd-vhosts.conf中。

“将每个请求都捕获到任何未指定的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...

可以在以下位置找到有关虚拟主机匹配过程的深入说明:http : //httpd.apache.org/docs/2.2/vhosts/details.html


2
_default_仅用于不匹配的IP,因此当您使用通配符的虚拟主机(*:80)时,将永远不会使用它。
Wirone

2

通配符包括您的站点配置文件:

Include path/to/site/confs/*httpd.conf

组织您的站点conf文件,以便按预期顺序加载它们。例...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

等等...

Apache将按顺序阅读这些内容。然后创建一个将始终最后加载的虚拟主机,以捕获任何不匹配的虚拟主机,并返回404而不是加载默认站点。

99-catchall-httpd.conf

<VirtualHost *:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost *:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

确保用您的httpd侦听的任何端口替换端口。或者,如果您在特定接口上监听了httpd,则需要为每个接口添加一个catchall,如下所示:

<VirtualHost 192.168.1.101:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>
<VirtualHost 192.168.1.101:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

希望这可以帮助。我使用此方法按指定的顺序加载站点,并防止不匹配的虚拟主机无意中加载意外站点。


1

最好的解决方案是重命名站点配置文件,以“ 1”开头,这样它将首先加载,这将是您的默认站点。

Apache2将第一个加载的vhost文件作为默认页面。


因此,默认的Apache安装也具有000-default虚拟主机。
vp_arth 2015年

0

<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.conf001_site1.conf002_site2.conf将在顺序读取与000_def.conf作为默认站点。(请注意:就我而言,我有这些“文件” /etc/apache2/sites-enabled实际上是指向中实际conf文件的动态链接/etc/apache2/sites-available

由于在001_site1.conf和002_site2.conf中使用了ServerName,因此还必须在000_def.conf中将其设置为某些名称。

# 000_def.conf:
<VirtualHost *:80>  
ServerName null
# NOTE: DO NOT USE "ServerAlias *" this seems to override the other conf files.
</VirtualHost>


# 001_site1.conf
<VirtualHost *:80>  
ServerName myabc.example.com
ServerAlias mylocalhostname host1.ddns.net
</VirtualHost>


# 002_site2.conf:
<VirtualHost *:80>  
ServerName host2.ddns.net
</VirtualHost>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.