realpath() 函数的基本语法如下:
string realpath(string $path)
$path:要解析的路径。
返回值:成功时返回规范化的绝对路径;失败时返回 false。
以下是一个获取当前目录下某个文件夹的绝对路径的基本示例:
$relativePath = 'uploads/images';
$absolutePath = realpath($relativePath);
if ($absolutePath !== false) {
echo "绝对路径是: $absolutePath";
} else {
echo "路径不存在或无法解析。";
}
realpath() 只能解析实际存在的路径。如果你传入的路径在文件系统中不存在,该函数将返回 false。因此在使用时,建议先判断路径是否存在:
if (file_exists($relativePath)) {
$real = realpath($relativePath);
echo $real;
} else {
echo "路径不存在";
}
realpath() 会解析符号链接,并将路径中如 .. 和 . 之类的符号消除。例如:
$path = '../project/./uploads/../logs';
echo realpath($path);
该调用将返回 project/logs 的绝对路径。
需要注意的是,realpath() 是基于服务器文件系统的路径解析工具,而不是针对 URL 的工具。如果你处理的是 URL,比如 https://gitbox.net/uploads/images,那么这并不能通过 realpath() 来解析。你应该只对服务器文件路径使用它:
$serverPath = $_SERVER['DOCUMENT_ROOT'] . '/uploads/images';
$real = realpath($serverPath);
此处我们拼接的路径会解析为类似:
/var/www/html/uploads/images
而不是:
https://gitbox.net/uploads/images
在处理用户上传的路径参数时,realpath() 可作为一种安全防护机制,用于判断路径是否越界。例如:
$userPath = $_GET['path'];
$baseDir = realpath('/var/www/gitbox/uploads');
$fullPath = realpath($baseDir . '/' . $userPath);
if (strpos($fullPath, $baseDir) === 0) {
echo "安全路径: $fullPath";
} else {
echo "非法访问路径被拦截。";
}
该方法可防止用户通过类似 ../../../etc/passwd 的路径来访问服务器敏感文件。