Если это Path_To_DocumentRoot/a/b/c.php
, всегда должен быть /a/b
.
Я использую это:
dirname($_SERVER["PHP_SELF"])
Но он не будет работать, когда он будет включен другим файлом в другом каталоге.
РЕДАКТИРОВАТЬ
Мне нужен относительный путь к документу root. Он используется в веб-приложении.
Я нахожу, что есть еще один вопрос с той же проблемой, но ответа пока нет.
PHP – конвертировать путь к файловой системе в URL
У вас есть доступ к $_SERVER['SCRIPT_NAME']
? Если вы это сделаете, выполните:
dirname($_SERVER['SCRIPT_NAME']);
Должно сработать. В противном случае выполните следующее:
В PHP <5.3:
substr(dirname(__FILE__), strlen($_SERVER['DOCUMENT_ROOT']));
Или PHP> = 5.3:
substr(__DIR__, strlen($_SERVER['DOCUMENT_ROOT']));
Возможно, вам понадобится realpath()
и str_replace()
все \
to /
чтобы сделать его полностью переносимым, например:
substr(str_replace('\\', '/', realpath(dirname(__FILE__))), strlen(str_replace('\\', '/', realpath($_SERVER['DOCUMENT_ROOT']))));
PHP <5.3:
dirname(__FILE__)
PHP> = 5.3:
__DIR__
РЕДАКТИРОВАТЬ:
Вот код, чтобы получить путь к включенному файлу относительно пути запуска php-файла:
$thispath = explode('\\', str_replace('/','\\', dirname(__FILE__))); $rootpath = explode('\\', str_replace('/','\\', dirname($_SERVER["SCRIPT_FILENAME"]))); $relpath = array(); $dotted = 0; for ($i = 0; $i < count($rootpath); $i++) { if ($i >= count($thispath)) { $dotted++; } elseif ($thispath[$i] != $rootpath[$i]) { $relpath[] = $thispath[$i]; $dotted++; } } print str_repeat('../', $dotted) . implode('/', array_merge($relpath, array_slice($thispath, count($rootpath))));
Я должен был создать что-то, что вам нужно, вот результат. Предоставляя базовый каталог, вы получаете относительный путь к файлу, начиная с базового каталога. Функция довольно быстро, 100 000 чеков взяли 0,64 с. на моем сервере. И он работает как для каталогов, так и для файлов. Это совместимо с linux. Даже не пробуйте это на окнах 🙂
/** * Return a relative path to a file or directory using base directory. * When you set $base to /website and $path to /website/store/library.php * this function will return /store/library.php * * Remember: All paths have to start from "/" or "\" this is not Windows compatible. * * @param String $base A base path used to construct relative path. For example /website * @param String $path A full path to file or directory used to construct relative path. For example /website/store/library.php * * @return String */ function getRelativePath($base, $path) { // Detect directory separator $separator = substr($base, 0, 1); $base = array_slice(explode($separator, rtrim($base,$separator)),1); $path = array_slice(explode($separator, rtrim($path,$separator)),1); return $separator.implode($separator, array_slice($path, count($base))); }
Вам необходимо получить относительный путь к файлу /var/www/example.com/media/test.jpg
Ваш базовый путь: /var/www/example.com
Используйте эту функцию следующим образом:
$relative = getRelativePath('/var/www/example.com','/var/www/example.com/media/test.jpg');
Функция вернет /media/test.jpg
.
Если вам нужна только часть /media
без использования файла, выполните следующие действия:
$relative = dirname(getRelativePath('/var/www/example.com','/var/www/example.com/media/test.jpg'));
Я знаю, что это старый вопрос, но решения, предлагаемые с помощью DOCUMENT_ROOT, предполагают, что структура веб-папок отражает структуру папок сервера. У меня есть ситуация, когда это не так. Мое решение таково. Вы можете определить, как адрес сервера сопоставляется с веб-адресом, если у вас есть пример из тех же папок с отображенными областями. Пока корневой файл php, содержащий этот файл, находится в одной и той же отображаемой области, у вас есть пример.
$ _SERVER ['SCRIPT_FILENAME'] – это адрес сервера этого файла, а $ _SERVER ['PHP_SELF'] – это веб-относительная версия. С учетом этих двух вы можете определить, какая версия вашего файла в Интернете относится к его серверному адресу (__FILE__) следующим образом.
function getCurrentFileUrl() { $file = __FILE__; $script = $_SERVER['SCRIPT_FILENAME']; $phpself = $_SERVER['PHP_SELF']; // find end of section of $file which is common to $script $i = 0; while($file[$i] == $script[$i]) { $i++; } // remove end section of $phpself that is the equivalent to the section of $script not included in $file. $phpself = substr($phpself, 0, strlen($phpself)-(strlen($script)-$i)); // append end section of $file onto result $phpself .= substr($file, $i, strlen($file)-$i); // complete address return $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['SERVER_NAME'].$phpself; }