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> 

如果您注册了一个域并将其指向我的服务器,它将默认显示与domain3相同的everythingelse。 那可能吗?

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

    当使用基于名字的虚拟主机时,加载的第一个虚拟主机configuration将是默认的(Source: Apache Wiki )。 例如,使用下面的configuration,否则不匹配的域将与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> 

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

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

    在这种情况下,要首先装载特定的虚拟主机configuration,请将链接重命名为某种在sorting时将首先执行的操作,例如00-default


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

    而且,虽然ServerAlias *确实可以匹配任何东西,但也可能会覆盖稍后定义的其他虚拟主机。 如果这个方法总是最后一个定义的虚拟主机(就像问题中给出的configuration一样),也许这种方法是可行的,但是这意味着添加一个新的指令改变sorting顺序,而不是像上面那样改变顺序。

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

     <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,因为这将优先于虚拟主机。

    顺序很重要 – 把你的虚拟主机定义移动到列表头部。

    使用_default_虚拟主机,并按照http://httpd.apache.org/docs/2.2/vhosts/examples.html中的说明将其放置在httpd-vhosts.conf&#x4E2D;

    “捕获每个请求到任何未指定的IP地址和端口,即不用于任何其他虚拟主机的地址/端口组合[…]默认虚拟主机决不会提供发送到地址/端口用于基于名称的虚拟主机,如果请求包含一个未知的或者没有主机:头,它总是从主要的基于虚拟主机的vhost(configuration文件中首先出现的地址/端口的虚拟主机)提供。

    从活动但混乱的httpd-vhosts.conf中正好将所有虚拟主机locking到端口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... 

    有关虚拟主机匹配过程的深入解释可以在这里find: http : //httpd.apache.org/docs/2.2/vhosts/details.html

    通配符包含您的站点configuration文件:

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

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

    01-的httpd.conf

    02现场1-的httpd.conf

    03-站点2-的httpd.conf

    等等…

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

    99包罗万象-的httpd.conf

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

    一定要用httpd监听的端口replace端口。 或者,如果您在特定的接口上监听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> 

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

    最好的解决scheme是重命名以“1”开头的站点configuration文件,所以它将首先加载,这将是您的默认站点。

    Apache2使第一个加载的虚拟主机文件成为默认页面。

    当使用<VirtualHost *:port>并为您关心的主机指定ServerName / ServerAlias时,这是我需要做的。

    在我的情况下有点背景:

    我有一个来自ISP的dynamicIP地址,所以我的IP地址在一个dynamicIP地址注册公司(我的情况是noip.org)注册。 我的一个“主机”需要在我的DNS注册中注册为myabc.example.com,作为指向host1.ddns.net的CNAME。 但host2.ddns.net保持原样。 我希望myabc.example.com和host1.ddns.net去站点1和host2.ddns.net去站点2和其他任何东西,包括我的IP地址去默认。

    第一个conf文件读取将是默认的,即000_def.conf001_site1.conf002_site2.conf将以000_def.conf作为默认站点的顺序读取。 (注意:在我的情况下,我在/etc/apache2/sites-enabled有这些“文件”,它们实际上是dynamic链接到/etc/apache2/sites-available的实际conf文件)

    由于ServerName正在001_site1.conf和002_site2.conf中使用,因此它也必须设置为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>