PHP在配置不正确的共享服务器上定义文档根

PHP在配置不正确的共享服务器上定义文档根,php,Php,我在一个共享服务器上有一个帐户,该服务器不再维护,配置也不是很好 echo $_SERVER["SCRIPT_FILENAME"] = '/path/to/my/root/and/now/path/to/my/file/location.php' 但是 echo $_SERVER["DOCUMENT_ROOT"] = '/var/www' 我需要找到网站的根,所以我写了自己的方法。我想知道的是,在我把它投入生产之前,是否有人看到了为什么它不能持续工作的原因 注意:我知道它不适用于includ

我在一个共享服务器上有一个帐户,该服务器不再维护,配置也不是很好

echo $_SERVER["SCRIPT_FILENAME"] = '/path/to/my/root/and/now/path/to/my/file/location.php'
但是

echo $_SERVER["DOCUMENT_ROOT"] = '/var/www'
我需要找到网站的根,所以我写了自己的方法。我想知道的是,在我把它投入生产之前,是否有人看到了为什么它不能持续工作的原因

注意:我知道它不适用于includes/requires、url重写、index.php或apache配置为静默访问的任何其他根扩展

以下是我的方法:

define('ROOT_PATH', str_replace(str_replace('/'.basename(__FILE__),'',     
$_SERVER["SCRIPT_URL"]),'',dirname(__FILE__)));

require_once ROOT_PATH.'/and/now/path/to/my/file/location.php';
本质上,它从脚本url中删除脚本名称,然后删除根目录后找到的任何目录名称

编辑:我上面的描述说“在根之后”,但是str_替换并不关心替换发生在字符串中的哪个位置。这可能把它弄坏了。因此,我修改了解决方案,仅替换匹配路径的最后一个实例:

define('ROOT_PATH',preg_replace('(.*)'.
preg_quote(str_replace('/'.basename(__FILE__),'',
$_SERVER["SCRIPT_URL"]),'~').'(.*?)~','$1'.''.'$2',dirname(__FILE__),1));

不幸的是,
preg\u replace
的速度有点慢。

最好的方法是完全避免使用它,而是定义一个“应用程序根目录”。如果您的
index.php
在此文件中,您应该:

define('APP_ROOT', dirname(__FILE__));
如果您想在一些包含的文件中定义它,例如
includes/approot.php
,只需为每个子文件夹再次调用
dirname

define('APP_ROOT', dirname(dirname(__FILE__)));

知道文档根并没有那么有用。知道应用程序根目录是。

是否确定它与符号链接无关,请执行
realpath($\u SERVER[“DOCUMENT\u root”])
realpath(root\u PATH)
给出两个不同的路径?前者给出了
/var/www
,后者给出了我希望从函数@jeroen获得的结果。是否移动到维护的服务器或您自己的VPS不是一个选项?如果这是一个指示,您可能会在这个服务器上遇到各种其他问题@HorusKol同意,这是下一步,但不幸的是,代码必须在这个服务器和新服务器上工作。因此,如果我想在这里的文件夹中使用它:
very/deep/path/to/my/folder/
我会做
dirname(dirname)(dirname)(dirname)(dirname)(dirname)(dirname)(dirname)(diru文件uu))))))
。我的方法无需考虑每个脚本的目录级别。相同的代码适用于所有级别。@user2320402您只需要在一个文件中执行我的代码,该文件可以位于应用程序的根目录中,然而,您的代码依赖于
SCRIPT\u URL
,该文件只应在Apache调用的第一个文件中使用。如果访问者第一次进入网站的页面不在根目录下且无法重定向,会发生什么情况?@user2320402则可能不是您应用程序的根目录。