Virtualmin虚拟主机中Drupal无法运行问题解决

07/16/2013

最近Kaijia发现虚拟主机也有虚拟主机的用处,在搞测试的时候非常方便,可以同时开几个虚拟主机一起测试,备份相当也很方便,测试到某一步出了问题还能直接还原备份文件。于是这次Kaijia装了个Virtualmin测试新的Info Flow平台,这个平台是架设在Drupal上的,结果刚传完Drupal的文件,打开网站的首页直接弹出了500错误提示”Internal Server Error“。

一开始Kaijia以为是缺少了某个Drupal需要的php模块,于是打开Virtualmin的Apache Error Log菜单一看发现了这样一条错误日志:

错误的提示是“Option FollowSymLinks not allowed here”,即不允许在.htaccess文件中使用FollowSymLinks属性。

FollowSymLinks属性的作用是允许服务器引用符号链接,在Apache的文档中给FollowSymLinks描述了如下注释:

Even though the server follows the symlink it does not change the pathname used to match against <Directory> sections.

The FollowSymLinks and SymLinksIfOwnerMatch Options work only in <Directory> sections or .htaccess files.

Omitting this option should not be considered a security restriction, since symlink testing is subject to race conditions that make it circumventable.

由此看来问题是由于Virtualmin禁用了FollowSymLinks由于整个环境是Kaijia控制的并且文档中也提示不是安全威胁,于是Kaijia在Webmin中尝试允许.htaccess设置FollowSymLinks,结果应用设置后仍然出现这个问题。于是Google了一下,找到了Virtualmin论坛中的一篇讨论,jonloh提到在一个开放的虚拟主机情况下,FollowSymLinks的确存在一定的安全隐患,另外他还提及,Drupal开发者正在讨论在Drupal 8.0中将FollowSymLinks替换为SymLinksIfOwnerMatch,所以这样的话解决方案就非常方便了。

首先通过FTP访问虚拟主机目录,编辑public_html/.htaccesspublic_html/sites/default/files/.htaccess这两个文件,找到(分别是第14和第3行):

修改为:

或者也可以直接注释掉这一行,这样再次访问就一切正常了。

当然,讨论还提到,如果你是Virtualmin虚拟主机的管理员,你可以直接使用以下命令替换将所有的FollowSymLinks替换为SymLinksIfOwnerMatch

这样服务器上所有的Drupal站点都会被修复了。