Apache htdocs下虚拟主机500错误


编辑: upupw 发布时间: 2013-08-20 10:42:14 来源: UPUPW绿色服务器平台 热度: 17724

Apache版htdocs目录下建立虚拟主机目录出现500错误是怎么回事呢?

最近热心的UPUPW使用者“正阳在线”向我们反馈了这么一个问题:htdocs目录下主站可以访问,在htdocs目录下建立的虚拟主机目录绑定域名后访问通通出现500错误。

起初以为是防火墙阻止了Apache端口或者服务商屏蔽了未备案域名的外部访问权限,但是这两者都不会出现500服务器错误而会直接返回连接超时或拒绝访问之类的。

进一步分析查看Apache错误报告中发现“configuration error: couldn't perform authentication.”这样的提示,意思是说配置错误,无法进行验证。

这里让我们想到了Satisfy指令,Satisfy All/Any 用在Directory 和.htaccess中。

我们知道在Apache的访问控制中,有两种机制,一是客户端目录访问限制,二是用户给出用户名和密码的验证机制。

当设置Satisfy值为All时,要求同时满足两个条件才可以访问。当设置Satisfy值为Any时,则只要满足一个就可以了。

UPUPW为了满足大众的各种需求设置Satisfy为All。

一般情况下用户给出用户名和密码的验证机制是不会设置的所以满足条件,那也就是说客户端目录访问限制这个条件没满足。

1、看到这里我们可以得到第一个解决方案:

在网站根目录的伪静态文件.htaccess中加入Satisfy Any

刷新下,页面刷的一下出来了,这种解决方案如果在虚拟主机特别多的情况下就有点吃力了不好管理。

接下来分析为什么没有满足目录访问权限?

为了安全,UPUPW对每个网站都做了目录限制来约束PHP的目录执行权限防止跨站攻击和脚本执行。

找到Apache2\conf\extra\httpd-vhosts.conf文件中localhost:80这个主机配置下的php_admin_value open_basedir这一行,意思是将用户访问文件的活动范围限制在指定的区域

从此可知如果把虚拟主机的目录建立在默认主机htdocs目录下并会出现权限叠加嵌套,从而只能访问到最上层执行权限htdocs目录下的网站,而htdocs目录下的其它虚拟主机就会返回500错误

2、看到这里我们可以得到第二个解决方案:

把php_admin_value open_basedir这行注释掉不执行上层权限,这样便可以让下层的虚拟主机目录没有权限叠加

刷新页面访问正常,这种方法将会造成默认主机htdocs目录以及下级目录用户都可以访问到,所以此处不建议把虚拟主机建立在htdocs目录下

3、由此得出最完美的解决方案

默认主机htdocs目录保持不变,建立虚拟主机的时候请不要建立在htdocs目录下,建立虚拟主机时可以不填路径自动生成在vhosts目录下,也可以填上绝对路径如:E:\server\site1或F:\website\web\site2

这样建立的虚拟主机就不会出现权限叠加嵌套导致下层主机目录无法访问了,OK,问题解决!

另外需要注意的是如果PHP中引用包含虚拟主机目录以外的文件将会无法执行,如果确实要require_once或其它形式进来的主机目录以外的文件请将那个目录的绝对路径包含到open_basedir的目录权限下。