在Web服务器上设置PHP Document Root

mik*_*ans 2 php apache ubuntu

目前我有一个运行apache2的Ubuntu 12.04网络服务器.我设置了动态创建子域名,方法是在/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>
Run Code Online (Sandbox Code Playgroud)

好奇为什么PHP没有拿起上面的虚拟文档根设置,我可能做错了.

Kev*_*cot 6

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

Apache模块mod_vhost_alias及其VirtualDocumentRoot指令确实可以节省本地开发的时间(一些谷歌搜索将解释为什么更多的deapth).基本上,我的本地开发人员已经设置好了,所以我只需要在别名目录中创建一个目录,然后我将浏览器导航到与该新目录名称相匹配的URL,并且apache确切地知道自动提供什么.

但是,使用mod_vhost_alias时有一些邪恶的问题,其中一个是PHP全局$ _SERVER ['DOCUMENT_ROOT']仍设置为apache默认的DOCUMENT_ROOT环境变量,而不是重新分配给VirtualDocumentRoot激活的文档根目录当前URL的指令.这可能会导致某些PHP应用程序(过于信任)因某种原因而死亡.

我在相关的apache错误报告中找到了一个很好的解决方案:只需在VirtualDocumentRoot vhost定义中的apache配置中添加以下行:

php_admin_value auto_prepend_file /path/setdocroot.php

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

<?php $_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']); ?>
Run Code Online (Sandbox Code Playgroud)

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