如何以编程方式确定PHP中的文档根?

Kim*_*van 6 php apache configuration

这是我最近遇到的一个问题 - 在webhost上配置错误的apache.这意味着所有依赖$_SERVER['DOCUMENT_ROOT']break的脚本.我发现最简单的解决方法是在一些共享的全局包含文件中设置变量,但不要忘记它是一种痛苦.我的问题是,如何以编程方式确定正确的文档根?

例如,在一台主机上,设置如下:

$_SERVER['DOCUMENT_ROOT'] == '/htdocs'
Run Code Online (Sandbox Code Playgroud)

真正的文件根源是:

test.example.com -> /data/htdocs/example.com/test
www.example.com -> /data/htdocs/example.com/www
Run Code Online (Sandbox Code Playgroud)

我想要一个从www.example.com/blog/(在路径上/data/htdocs/example.com/www/blog)运行的脚本来获取正确的值/data/htdocs/example.com/www.

在另一台主机上,设置有点不同:

$_SERVER['DOCUMENT_ROOT'] == '/srv'
test.example.com -> /home/virtual_web/example.com/public_html/test
www.example.com -> /home/virtual_web/example.com/public_html/www
Run Code Online (Sandbox Code Playgroud)

这有什么解决方案吗?或者是唯一的方法是不依赖$_SERVER['DOCUMENT_ROOT']并修复我在我的网站上运行的所有软件?在托管方面修复这个似乎不是一个选项,我还没有遇到一个正确配置的主机.我得到的最好的是一个指向www.example.com的文档根,至少在open_basedir中 - 他们使用了另一个命名方案,www.example.com指出/u2/www/example_com/data/www/.

Ein*_*eki 7

在PHP5中,有一个魔术常量__FILE__,它包含出现的文件的绝对路径.您可以将它与dirname结合使用来计算文档根目录.

您可以在配置文件中添加如下所示的语句

define ('DOCUMENT_ROOT', dirname(__FILE__));
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题

  • 从PHP 5.3开始,这也是`__DIR__`使用而不是`dirname(__ FILE __)`. (3认同)

Kim*_*van 2

基于http://www.helicron.net/php/

$localpath=getenv("SCRIPT_NAME");
$absolutepath=getenv("SCRIPT_FILENAME");
$_SERVER['DOCUMENT_ROOT']=substr($absolutepath,0,strpos($absolutepath,$localpath));     
Run Code Online (Sandbox Code Playgroud)

我必须更改基本名称/真实路径技巧,因为它在我的主机上返回一个空字符串。相反,我使用SCRIPT_FILENAME. 这可能不再适用于 IIS(但使用 $_SERVER 变量的原始脚本可能也不再适用)。