如果我有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中
“捕获每个请求到任何未指定的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.conf
, 001_site1.conf
, 002_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>