我已经安装了 apache 2 并创建并启用了一个虚拟主机。
虚拟主机有: 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的内容
它没有缓存在浏览器中,我已经清除了缓存并尝试了另一个浏览器并尝试通过代理。
这对我来说毫无意义。任何想法?
以下是 /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”替换了实际的域名,只是为了在 SF 上发布)
/etc/apache2/sites-enabled/ 中链接了哪些其他文件?
通常,启用 mod-info 对诊断目的很有用,如下所示(来自http://httpd.apache.org/docs/2.2/mod/mod_info.html):
通常我用证书来保护它,但这超出了这个解释。一旦你启用了它,并限制为 127.0.0.1(通过 ssh 连接到服务器的隧道,设置你的主机文件等)。您可以看到 Apache 解析的确切运行配置。您可能会看到 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 虚拟主机。不匹配任何服务器名或别名的请求将被默认站点捕获,因为它是第一个。
“第一个列出的虚拟主机会捕获与服务器名/服务器别名不匹配的任何内容,即使您指定了服务器名也是如此。”