매일 PHP 개발에서 파싱 파일 경로는 일반적인 요구 사항 중 하나입니다. RealPath () 함수는 파일에 정규화 된 절대 경로를 얻기위한 강력한 도구이지만, 심포 링크를 다룰 때 동작이 혼란 스러울 수 있습니다. 이 기사는 RealPath () 의 작업 원리를 체계적으로 설명하고 기호 링크를 처리하기 위해 실제 프로젝트에서 올바르게 사용하는 방법에 대한 실질적인 팁을 공유합니다.
RealPath ()는 경로의 정규화 된 절대 경로를 반환합니다. 이것은 요소와 같은 요소를 구문 분석한다는 것을 의미합니다 . , .. 및 상징적 링크.
샘플 코드 :
$path = realpath('./myfolder/../link-to-file.txt');
echo $path;
이 예에서, ... 경로에서는 구문 분석 될 것이며, 상징적 링크가 존재하면 실제 경로로 구문 분석됩니다.
상징적 링크에 RealPath ()를 사용하면 링크 자체의 위치가 아니라 링크가 가리키는 실제 경로를 반환합니다. 이것은 어떤 경우에는 원하는 것이 아닐 수도 있습니다.
예를 들어:
// 가정 link.txt 상징적 링크입니다,정위 /data/files/realfile.txt
$resolvedPath = realpath('/var/www/html/link.txt');
echo $resolvedPath;
if /var/www/html/link.txt 는 symlink 입니다 .
RealPath ()는 대상 경로의 존재에 따라 다릅니다. 경로의 어떤 레벨이 존재하지 않으면, 그것은 false를 반환합니다. 즉 , 아직 생성되지 않은 파일 경로에는 사용할 수 없습니다 .
예:
$nonExistent = realpath('/path/to/nonexistent/file.txt');
var_dump($nonExistent); // 산출 bool(false)
RealPath ()를 호출하기 전에 경로가 존재하는지 확인하십시오.
$path = '/var/www/html/link.txt';
if (file_exists($path)) {
echo realpath($path);
} else {
echo "경로는 존재하지 않습니다";
}
가리키는 대상 대신 상징적 링크 자체의 경로를 얻으려면 readLink ()를 사용할 수 있습니다.
$link = '/var/www/html/link.txt';
if (is_link($link)) {
echo readlink($link); // 링크 대상으로 돌아갑니다
}
기호 링크 자체의 절대 경로를 얻으려면 dirname () 및 readlink ()를 결합 할 수 있습니다.
$link = '/var/www/html/link.txt';
if (is_link($link)) {
$target = readlink($link);
$realTarget = realpath(dirname($link) . '/' . $target);
echo $realTarget;
}
경로가 존재하지 않을 때 상징적 인 링크를 "구문 분석"하려면 해상도를 사용자 정의 할 수 있습니다.
function custom_realpath($path) {
$parts = explode('/', $path);
$absolutes = [];
foreach ($parts as $part) {
if ($part === '' || $part === '.') continue;
if ($part === '..') {
array_pop($absolutes);
} else {
$absolutes[] = $part;
}
}
return '/' . implode('/', $absolutes);
}
$resolved = custom_realpath('/var/www/html/../html/link.txt');
echo $resolved;
이 방법은 상징적 링크를 구문 분석하는 것이 아니라 정상화됩니다 . 그리고 . 길에서.
웹 파일 브라우저를 개발하고 있으며 사용자가 업로드 한 경로가 /var/www/data 디렉토리로 제한되기를 원합니다. 구문 분석 경로가 여전히 해당 디렉토리에 있는지 확인해야합니다.
$base = realpath('/var/www/data');
$userPath = $_GET['path']; // 예를 들어:link/to/file.txt
$fullPath = realpath($base . '/' . $userPath);
if ($fullPath && strpos($fullPath, $base) === 0) {
echo "액세스 허용:$fullPath";
} else {
echo "불법 경로";
}
링크/file.txt가 심볼 링크 인 경우 RealPath는 대상 위치를 해결합니다. 구문 분석 된 대상이 여전히 $ base 내에 있음을 확인해야합니다.
기능 | 기능 설명 |
---|---|
RealPath () | 절대 경로, 심포 링크 및 경로 구성 요소를 반환합니다 |
__ 디르 __ | 현재 파일이있는 디렉토리, 컴파일 시간 결정 |
getcwd () | 현재 작업 디렉토리, 런타임 결정 |
경로를 사용할 때 올바른 기능을 선택하면 특히 CLI 및 웹 환경이 혼합 될 때 경로 혼동을 피할 수 있습니다.
RealPath () 는 PHP 파일 경로 관리에서 없어서는 안될 도구이지만 기호 링크를 처리 할 때주의해야합니다. IS_LINK () , readLink () 및 경로 검증 기술을 결합하여 더 안전하게 사용할 수 있습니다. 그 한계를 이해 함으로써만 복잡한 파일 시스템 구조에서 강력한 코드를 작성할 수 있습니다.
PHP 파일 경로 및 기호 링크 사용의 더 많은 예는 다음을 참조하십시오. https://gitbox.net/articles/php-symlink-realpath