Answers:
__DIR__
。它是相对于文件本身的,因此,如果包含在子目录内的包含中,它将不会仅返回您的根目录。
当你这么说
$_SERVER['DOCUMENT_ROOT']
包含以下路径:
D:/workspace
那D:
就是您要寻找的,不是吗?在这种情况下,您可以使用斜杠将字符串爆炸并返回第一个字符串:
$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];
这将输出服务器的根目录。
更新:当您使用常量DIRECTORY_SEPARATOR
而不是硬编码的斜杠('/'
)时,此代码也可以在Windows下使用。
更新2:在$_SERVER
全局变量并不总是可用的。例如在命令行(cli)上。因此,您应该使用__DIR__
而不是$_SERVER['DOCUMENT_ROOT']
。__DIR__
返回php文件本身的路径。
__DIR__
代替$_SERVER['DOCUMENT_ROOT']
。
我想指出Wordpress处理此问题的方式:
define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );
由于Wordpress在网络上使用量很大,并且在本地也可以正常工作,因此我对这种方法非常信任。
你可以试试:
$_SERVER['PATH_TRANSLATED']
引用:
服务器完成任何虚拟到实际的映射之后,当前文件的基于文件系统(不是文档根目录)的路径。注意:从PHP 4.3.2开始,
PATH_TRANSLATED
与Apache 1中的情况相比,不再在Apache 2 SAPI下隐式设置该属性,在Apache 1 SAPI中,SCRIPT_FILENAME
当未由Apache填充时,它被设置为与服务器变量相同的值。
进行此更改是为了符合CGI规范,即仅在PATH_INFO
定义了PATH_TRANSLATED的情况下才应存在。Apache 2用户可以使用AcceptPathInfo = On
Insidehttpd.conf
来定义PATH_INFO
资料来源: php.net/manual
摘要
本示例假定您始终知道apache根文件夹在哪里,并且您正在尝试查找下一个文件夹路径(例如,“ / var / www / my_website_folder”)。这也可以从脚本或Web浏览器中使用,这就是为什么需要附加代码的原因。
代码PHP7
function getHtmlRootFolder(string $root = '/var/www/') {
// -- try to use DOCUMENT_ROOT first --
$ret = str_replace(' ', '', $_SERVER['DOCUMENT_ROOT']);
$ret = rtrim($ret, '/') . '/';
// -- if doesn't contain root path, find using this file's loc. path --
if (!preg_match("#".$root."#", $ret)) {
$root = rtrim($root, '/') . '/';
$root_arr = explode("/", $root);
$pwd_arr = explode("/", getcwd());
$ret = $root . $pwd_arr[count($root_arr) - 1];
}
return (preg_match("#".$root."#", $ret)) ? rtrim($ret, '/') . '/' : null;
}
例
echo getHtmlRootFolder();
输出:
/var/www/somedir/
细节:
基本上,首先尝试获取DOCUMENT_ROOT(如果它包含“ / var / www /”),然后使用它,否则获取当前目录(项目中存在的目录),并根据$ root路径的计数获取下一个路径值。注意:添加了rtrim语句,以确保在所有情况下路径返回均以'/'结尾。它不检查它是否需要大于/ var / www /,也可以返回/ var / www /作为可能的响应。