我有以下 VirtualHost
// filename: /etc/apache2/sites-available/ccbbbcc
<VirtualHost 1.1.1.1:80>
ServerAdmin [email protected]
ServerName ccbbbcc.com
ServerAlias www.ccbbbcc.com
DocumentRoot /srv/www/ccbbbcc/production/public_html/
ErrorLog /srv/www/ccbbbcc/production/logs/error.log
CustomLog /srv/www/ccbbbcc/production/logs/access.log combined
</VirtualHost>
然后我还有
//filename: /etc/apache2/sites-available/default
<VirtualHost 1.1.1.1:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
blah blah blah
为什么当我在浏览器中输入http://1.1.1.1,这需要我http://ccbbbcc.com? 即使我将新 URL 指向 IP 1.1.1.1,网页仍从http://ccbbbcc.com. 为什么我无法从 /var/www 目录提供页面?
其他症状 - cccbbbcc vhost 仅覆盖了我的部分其他 vhost。不是全部。
补充笔记
我已确保使用 a2ensite 并重新启动 apache。
这就是我的 /etc/apache2/ports.conf 的样子
NameVirtualHost 1.1.1.1:80
Listen 80
Listen 443
我创建了一个名为 /srv/www/ccbbbcc/production/public_html/test.html 的文件,其中包含文本“Hello World”。当我输入http://ccbbbcc.com/test.html,页面加载正常。当我输入http://1.1.1.1/test.html,我得到了 404 页面未找到。当我输入http://1.1.1.1/,网络浏览器刷新,然后显示网址http://ccbbbcc.com然后我将 test.html 附加到 url 末尾,Hello World 再次出现。
那么这是否意味着某处发生了 http 重定向?如果是这样,我似乎无法确定是什么原因造成的。
另外,我注意到 cccbbbcc 覆盖了我的部分虚拟主机,而不是全部。似乎没有区分/覆盖哪个虚拟主机的模式。
我还注意到,如果我执行以下操作
1. a2dissite ccbbbcc
2. /etc/init.d/apache2 reload
3. a2ensite ccbbbcc
4. /etc/init.d/apache2 reload
然后突然间,http://ccbbbcc.com提供来自 /var/www/ 的页面,并且http://1.1.1.1还从 /var/www 提供页面。 a2ensite/a2dissite 如何影响页面加载位置? 让 cccbbbcc 再次从 /srv/www/cbs/production 提供页面的唯一方法是重新启动我的整个 Linux 服务器! 发生了什么?
答案1
正如你所读到的虚拟主机匹配的深入讨论:
此列表中的第一个 vhost(配置文件中具有指定 IP 地址的第一个 vhost)具有最高优先级,并捕获对未知服务器名称的任何请求或没有 Host: 标头字段的请求。
您的 Apache httpd/etc/apache2/sites-available/ccbbbcc
之前会加载并评估该文件/etc/apache2/sites-available/default
。
/etc/apache2/sites-available/default
例如,将其重命名为/etc/apache2/sites-available/00_default
和,以便首先加载默认文件。/etc/apache2/sites-available/ccbbbcc
/etc/apache2/sites-available/01_ccbbbcc
答案2
您是否有 NameVirtualHost 指令?
看这里: http://httpd.apache.org/docs/2.0/mod/core.html#namevirtualhost
基本上,如果您没有 NameVirtualHost * 或特定的 NameVirtualHost 1.1.1.1:80 指令,则虚拟主机不是基于名称的,而是基于地址:端口的。
答案3
如果您的虚拟主机中没有 ServerName/ServerAlias 块,apache 将为配置读取期间首先实例化的域提供服务。在这种情况下,按字母顺序排列,ccbbbccc.com 的配置文件必须位于默认之前。
在 /etc/apache2/sites-enabled/default 中添加 ServerName 和/或 ServerAlias 指令,然后就设置好了。