目前我有一个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上周发布了第一个点版本。