PHP:Как получить корневой каталог документа из каталога пользователя?
-
08-10-2019 - |
Вопрос
Я разрабатываю и развертываю различные PHP-приложения в разных средах.Особенно в средах разработки, они могут быть где угодно, от document_root до /Users/me/Sites / или даже /Users/me/Sites/someapp/
Внутри этих приложений мне нужно знать, где находится "корень приложения", один раз как реальный путь и один раз как URL.Путь - это не проблема.Допустим, у меня есть bootstrap.php в корневом каталоге приложения, который делает:
define("BASE_DIR", realpath(dirname(__FILE__)));
Однако у меня возникают проблемы с надежным получением базового URL.В большинстве сред работает простое вычитание корня документа из BASE_DIR:
define("BASE_URL", str_replace($_SERVER['DOCUMENT_ROOT'],'',BASE_DIR) . "/");
Теперь моя проблема в том, что:Это не работает в средах, где мое приложение находится внутри моего пользовательского каталога, потому что PHP по-прежнему видит корневой каталог основного документа.Кто-нибудь решил эту проблему?
Решение
Все, что связано с realpath() и DOCUMENT_ROOT, приведет к серьезному сбою, когда на сервере будут настроены псевдонимы.Рассмотрим сценарий, в котором Apache имеет конфигурацию, подобную этой:
DocumentRoot /home/httpd/html
Alias /testalias /home/otherdir
И вы получаете доступ к скрипту по адресу example.com/testalias/script.php
.
Скрипт вернет:
realpath(dirname(__FILE__)) -> /home/otherdir
$_SERVER['DOCUMENT_ROOT'] -> /home/httpd/html
BASE_DIR -> /home/otherdir
BASE_URL -> /home/otherdir/
и все же остальная часть сайта на самом деле существует в /home/httpd/html
Возможно, вам повезет больше при восстановлении URL-адреса на основе $_SERVER['SCRIPT_NAME']
, который является частью URL-адреса path / script name:
$_SERVER['SCRIPT_NAME'] -> /testalias/script.php