我已经安装了Apache 2并创build并启用了虚拟主机。
虚拟主机有:ServerName example.com ServerAlias * .example.com ServerAlias foo.com ServerAlias * .foo.com ServerAlias bar.com ServerAlias * .bar.com
如果我把浏览器定向到www.example.com,test.example.com ,foo.com,www.foo.com等,除了裸露的服务器名称,它可以正常工作,显示/ srv / www的内容/example.com/public_html/index.php,它是虚拟主机的DocumentRoot。
但是,如果我在浏览器中只写“ example.com ”,我会看到/var/www/index.html的内容
它没有被caching在浏览器中,我已经清除了caching,并尝试了另一个浏览器,并尝试通过代理。
这对我来说没有意义。 任何想法?
这里是/ etc / apache2 / sites-enabled / 000-default的内容
<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> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
这里是/etc/apache2/sites-enabled/example.com的内容:
<VirtualHost *:80> ServerName example.com ServerAlias *.example.com ServerAlias foo.com ServerAlias *.foo.com ServerAlias bar.com ServerAlias *.bar.com #... and a few others DocumentRoot /srv/www/example.com/public_html ErrorLog /srv/www/example.com/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel notice CustomLog /srv/www/example.com/access.log combined <Directory /srv/www/example.com/public_html> Options FollowSymLinks AllowOverride All </Directory> </VirtualHost>
我无法理解,为什么使用纯粹的服务器名称,默认的虚拟主机胜过与服务器名称特别匹配的虚拟主机,而所有别名都能正常工作。
这里是#apache2ctl -S的输出
VirtualHost configuration: wildcard NameVirtualHosts and _default_ servers: *:443 is a NameVirtualHost default server example.com (/etc/apache2/sites-enabled/default-ssl:2) port 443 namevhost example.com (/etc/apache2/sites-enabled/default-ssl:2) *:80 is a NameVirtualHost default server example.com (/etc/apache2/sites-enabled/000-default:1) port 80 namevhost example.com (/etc/apache2/sites-enabled/000-default:1) port 80 namevhost example.com (/etc/apache2/sites-enabled/example.com:1) Syntax OK
(我想不用说,我已经用“example.com”,“foo.com”和“bar.com”replace了实际的域名,只是在SF上发布的)
还有哪些其他文件在/ etc / apache2 / sites-enabled /中链接?
通常它是用来诊断的目的启用mod-info,就像这样(从http://httpd.apache.org/docs/2.2/mod/mod_info.html ):
<Location /server-info> SetHandler server-info </Location> <Location /server-info> SetHandler server-info Order deny,allow Deny from all Allow from yourcompany.com </Location>
通常我用证书来保证这一点,但是这超出了这个解释。 一旦你已经启用,并限制为127.0.0.1(隧道SSH与服务器,设置您的主机文件等)。 您可以看到Apacheparsing的确切运行configuration。 您可能会看到example.com在其他地方被引用。 当你使用mod-info的时候,通常事情会变得更有意义。
显然,文档不清楚这一点。
从https://issues.apache.org/bugzilla/show_bug.cgi?id=57384
“如果您在[虚拟主机定义]中省略了ServerName,则会从系统主机名(系统主机名的双向反向DNS查询)中计算出来。 因此,如果启用的站点000-default没有服务器名称,那么就好像它具有example.com作为ServerName,作为example.com我的服务器的主机名称。
因此,在我的情况下,当客户端请求域example.com时,000-default是与请求的主机名匹配的第一个服务器,并“捕获”请求。
如果我想(像我一样)让默认站点捕获所有与任何服务器名称不匹配的请求,我需要在默认的VirtualHost定义中指定一个虚拟的ServerName。 这样,对服务器主机名的请求将不匹配默认的虚拟主机,但它们将匹配example.com虚拟主机。 而且不匹配任何服务器名称或别名的请求将被默认站点捕获,因为它是第一个。
“即使您指定了服务器名称,第一个列出的vhost也会捕获与servername / serveralias不匹配的任何内容。”