我在 Ubuntu 12.04 上运行着 Apache 2.2.22 + PHP 5.4.9
我在这里托管三个网站。为此,我有 2 个虚拟主机指向三个不同的文件夹。
例如,这是域1
<VirtualHost *:80>
ServerName domain1.com
ServerAlias www.domain1.com
ServerAdmin [email protected]
DocumentRoot /mnt/htdocs/domain1.com/public
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /mnt/htdocs/domain1.com/public>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
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}/domain1.com-error.log
CustomLog ${APACHE_LOG_DIR}/domain1.com-access.log combined
</VirtualHost>
这里的 1% 的命中进入了错误的文件夹,其余 99% 的命中进入了正确的文件夹并解析了正确的域/代码。
domain1.com 错误日志中的错误示例
[Fri Feb 14 15:21:45 2014] [error] [client 10.183.250.134] PHP Fatal error: Class 'Sitemap\\SitemapServiceProvider' not found in /mnt/htdocs/domain1.com/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php on line 123, referer: http://www.site2.com/someurl
该服务提供商不存在,因为 domain2.com 被路由到 domain1.com 的文件夹。
此错误完全是随机的。如果我重新加载错误页面,网站就会正常呈现。
我检查了 vhosts 的所有行,删除了所有不重要的行以保持其简单,但错误仍然存在。
任何想法?
答案1
我有一个理论……我自己也遇到过类似的问题。以下是我的想法:
你有没有
NameVirtualHost *:80
在你的httpd配置文件? 最好在你虚拟主机定义。
如果你没有这样的行,请添加它。如果你有明确指定 IP 的行,如下所示:
NameVirtualHost 1.2.3.4:80
然后将其更改为符合您的虚拟主机定义,反之亦然。底线是你的名称虚拟主机线路需要匹配你所有的虚拟主机行。最后,应该只有一NameVirtualHost 行用于整个 Apache 配置...也就是说,在所有 .conf 文件中,您应该只看到一行 NameVirtualHost。您可以使用类似以下内容:
grep -r ^NameVirtualHost /etc/apache2/*
找到所有这些。
如果你有多个名称虚拟主机和/或所有你的虚拟主机不符合你的名称虚拟主机定义,您将从 Apache 获得不可预测/不一致的行为。