在web服务器上设置PHP文档的根目录


Setting PHP Document Root on webserver

目前我有一个Ubuntu 12.04网络服务器运行apache2。我设置它通过在/sites/example.com/*/public下创建新文件夹来动态创建子域/sites/example.com/www/public是为我的主根站点保留的。

这是工作,但是我无法配置PHP的$_SERVER['DOCUMENT_ROOT']动态到新创建的文件夹。

当我返回$_SERVER['DOCUMENT_ROOT']时,我得到/etc/apache2/htdocs,我认为这是某种默认路径。我希望这是:/sites/example.com/*/public而不是

# Wildcards
<VirtualHost *:80>
    VirtualDocumentRoot /sites/example.com/%1/public
    ServerAdmin mike@example.com
    ServerAlias *.example.com
</VirtualHost>

想知道为什么PHP不拾取上面的虚拟文档根设置,我可能做错了什么

解决方案:http://joshbenner.me/blog/quick-tip-get-proper-document-root-when-using-mod-vhost-alias/

Apache模块mod_vhost_alias及其VirtualDocumentRoot指令确实可以为本地开发节省大量时间谷歌会更深入地解释原因)。基本上,我的本地开发者是所以我只需要在我的别名中创建一个目录目录,然后将浏览器导航到与新目录的名称,apache就知道该提供什么服务自动.

然而,在使用mod_vhost_alias时,有一些邪恶的陷阱其中之一是PHP全局$_SERVER['DOCUMENT_ROOT']保持设置到apache默认的DOCUMENT_ROOT环境变量,而不是重新分配给文档根目录VirtualDocumentRoot指令用于当前URL。这可能会导致一些PHP应用程序(过于信任)不会因为某个原因而夭折另一个地方。

我在相关的apache bug报告中找到了一个很好的解决方案:文件中的apache配置中添加以下行即可VirtualDocumentRoot vhost定义:

php_admin_value auto_prepend_file/path/setdocroot.php

然后,创建所引用的PHP文件,并将set this作为其内容:

<?php $_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']); ?>

现在,每个页面加载都执行这个文件,它正确地设置DOCUMENT_ROOT .

这显然(最终)在Apache 2.4中得到了修复。不幸的是,Ubuntu 12.04仍然运行Apache 2.2。

话虽如此,Ubuntu 14.04(下一个LTS版本)现在已经发布,do-release-upgrade现在应该在12.04到14.04的升级中启用,因为14.04上周发布了第一个点版本。