0

我在共享服务器上有一个帐户,该帐户不再维护且配置不完善。

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

但 ...

echo $_SERVER["DOCUMENT_ROOT"] = '/var/www'

我需要找到站点根目录,所以我编写了自己的方法来做到这一点。我想知道的是,是否有人在我将其投入生产之前看到了为什么它不能始终如一地工作的原因?

注意:我知道它不适用于包含/要求、url-rewriting 或 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_replace 并不关心替换发生在字符串中的哪个位置。这可能会破坏它。因此,我修改了我的解决方案,只替换匹配路径的最后一个实例:

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

preg_replace不幸的是有点慢。

4

1 回答 1

2

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

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

如果您想在某些包含的文件中定义它,例如includes/approot.php,只需dirname为每个子文件夹再次调用:

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

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

于 2013-06-22T13:28:03.177 回答