我在共享服务器上有一个帐户,该帐户已不再维护且配置不当。
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-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中删除脚本名称,然后删除在root之后找到的所有目录名称。
编辑:我上面的描述是'在root之后',但str_replace并不关心替换发生在字符串中的哪个位置。这可能会破坏它。因此,我已将我的解决方案修改为仅替换匹配路径的最后一个实例:
define('ROOT_PATH',preg_replace('(.*)'.
preg_quote(str_replace('/'.basename(__FILE__),'',
$_SERVER["SCRIPT_URL"]),'~').'(.*?)~','$1'.''.'$2',dirname(__FILE__),1));
不幸的是, preg_replace
有点慢。
答案 0 :(得分:2)
最好的方法是完全避免使用它,而是定义一个“应用程序根”。如果您的index.php
在此文件中,则应该:
define('APP_ROOT', dirname(__FILE__));
如果您想在某个包含的文件中定义此内容,例如includes/approot.php
,请为每个子文件夹再次调用dirname
:
define('APP_ROOT', dirname(dirname(__FILE__)));
了解文档根目录并不是很有用。了解应用程序根目录。