PHP:如何从用户目录中获取文档根?

PHP:如何从用户目录中获取文档根?,php,apache,directory,document-root,Php,Apache,Directory,Document Root,我在不同的环境中开发和部署各种PHP应用程序。特别是在开发环境中,它们可以在任何地方,从document_root到/Users/me/Sites/甚至/Users/me/Sites/someapp/ 在这些应用程序中,我需要知道“应用程序根”在哪里,一次作为实际路径,一次作为URL。路径没有问题。假设我在应用程序根目录中有一个bootstrap.php,它可以: define("BASE_DIR", realpath(dirname(__FILE__))); 但是,我无法可靠地获取基本URL

我在不同的环境中开发和部署各种PHP应用程序。特别是在开发环境中,它们可以在任何地方,从document_root到/Users/me/Sites/甚至/Users/me/Sites/someapp/

在这些应用程序中,我需要知道“应用程序根”在哪里,一次作为实际路径,一次作为URL。路径没有问题。假设我在应用程序根目录中有一个bootstrap.php,它可以:

define("BASE_DIR", realpath(dirname(__FILE__)));
但是,我无法可靠地获取基本URL。在大多数环境中,只需从基本目录中减去文档根目录即可:

define("BASE_URL", str_replace($_SERVER['DOCUMENT_ROOT'],'',BASE_DIR) . "/");

现在,我的问题是:这在我的应用程序位于用户目录中的环境中不起作用,因为PHP仍然可以看到主文档根。有人解决了这个问题吗?

当服务器配置了别名时,任何涉及realpath()和DOCUMENT\u ROOT的操作都会失败。考虑一个场景,Apache有这样的配置:

DocumentRoot /home/httpd/html
Alias /testalias /home/otherdir
您可以访问
example.com/testalias/script.php
上的脚本

脚本将返回:

realpath(dirname(__FILE__)) -> /home/otherdir
$_SERVER['DOCUMENT_ROOT'] -> /home/httpd/html
BASE_DIR -> /home/otherdir
BASE_URL -> /home/otherdir/
然而站点的其余部分实际上存在于
/home/httpd/html

基于
$\u SERVER['SCRIPT\u NAME']
(URL的路径/脚本名称部分)重建URL可能会更幸运:

$_SERVER['SCRIPT_NAME'] -> /testalias/script.php

当服务器配置了别名时,任何涉及realpath()和DOCUMENT_ROOT的操作都会失败。考虑一个场景,Apache有这样的配置:

DocumentRoot /home/httpd/html
Alias /testalias /home/otherdir
您可以访问
example.com/testalias/script.php
上的脚本

脚本将返回:

realpath(dirname(__FILE__)) -> /home/otherdir
$_SERVER['DOCUMENT_ROOT'] -> /home/httpd/html
BASE_DIR -> /home/otherdir
BASE_URL -> /home/otherdir/
然而站点的其余部分实际上存在于
/home/httpd/html

基于
$\u SERVER['SCRIPT\u NAME']
(URL的路径/脚本名称部分)重建URL可能会更幸运:

$_SERVER['SCRIPT_NAME'] -> /testalias/script.php

可能重复感谢,但我只是在那里尝试了解决方案,它给出的结果取决于包含给定代码的文件的位置。或者更确切地说:该解决方案要求bootstrap.php始终位于根目录中(尽管为了简单起见,我说了其他方法,但它位于“includes/”目录中)。但我想最简单的解决方案是将它移到顶部,并使用此处链接的解决方案。谢谢的可能重复,但我只是在那里尝试了该解决方案,它给出的结果取决于包含给定代码的文件的位置。或者更确切地说:该解决方案要求bootstrap.php始终位于根目录中(尽管为了简单起见,我说了另外一种说法,但我把它放在了一个“includes/”目录中)。但我想最简单的解决方案是将其移到顶部,并使用此处链接的解决方案。这就是该解决方案所做的,alexn将其链接为可能的副本。我认为他是对的,问题是相同的,但我仍然认为该解决方案仅在应用程序根目录中的引导文件中有效。我在u使用别名目录str_replace($_服务器['SCRIPT_NAME'],'',$_服务器['SCRIPT_FILENAME']))SCRIPT_NAME的问题是它不是静态的,因为它基于当前执行脚本的名称。在Apache 2.3.x普及之前,我们可以使用CONTEXT_PREFIX变量。我恐怕没有解决方案。这就是解决方案所做的,alexn将其链接为可能的副本。我认为他是对的问题是一样的,但我仍然认为那里的解决方案只适用于应用程序根目录中的引导文件。我在使用别名目录str_replace($_SERVER['SCRIPT_NAME'],'',$_SERVER['SCRIPT_FILENAME']时使用此选项)SCRIPT_NAME的问题在于它不是静态的,因为它基于当前执行脚本的名称。在Apache 2.3.x普及之前,我们可以使用CONTEXT_PREFIX变量。恐怕没有解决方案。