Где установить PHP $ _SERVER Трейлинг слэш?

Иногда $_SERVER['DOCUMENT_ROOT'] возвращается с завершающей косой чертой. В других средах это не так. Где это можно указать?

Вы не можете сказать заранее, если $_SERVER['DOCUMENT_ROOT'] содержит косую черту в конце или нет.

Обычно, если он правильно настроен, он не содержит конечной косой черты. В Ubuntu (как и в других UNIX) правильно написанный путь к каталогу не имеет / в конце. Например, в Windows apache даже откажется запускаться, если он настроен на один. В UNIX Apache не является разборчивым и позволяет с завершающим косой чертой.

Но есть одно исключение, если вы создаете свой корневой каталог ( / ) ваш корень документа. Из-за этого случая вы не можете заранее сказать, содержит ли он конечную косую черту.

В любом случае он содержит значение директивы DocumentRoot – с или без конечной косой черты, как это было записано в файле конфигурации httpd. PHP использует только значение apache. Чтобы получить реальный корень документа, используйте realpath и / или условно добавьте косую черту (или удалите ее) в конце, если либо в вашем файле конфигурации, либо в вашем PHP-коде.

Я использую текущий каталог больше, чем я использую docroot, потому что он также хорошо работает в командной строке и в модульных тестах. Я обычно использую что-то вроде:

 require_once(dirname(__FILE__).'/../../../../constants.php'); 

Скорее, чем:

 require_once($_SERVER['DOCUMENT_ROOT'].'/../constants.php'); 

Я впервые увидел его в источнике WordPress и ему очень понравилось, но это может привести к повторению «../».

PS FILE – это текущий файл, и dirname отделяет /something.php от конца, оставляя путь к каталогу, содержащему текущий файл.

Вы можете сделать это так, чтобы убедиться, что конечная косая черта всегда присутствует

'/'. trim ($ _SERVER ['DOCUMENT_ROOT'], '/'). '/'

 require_once( '/'.trim( $_SERVER['DOCUMENT_ROOT'], '/' ).'/'.'constants.php' ); 

Я думаю, что это зависит от конфигурации сервера, если веб-корень определяется с помощью косой черты или без нее. Просто проверьте, что это на каждой системе равно.

См. Также ServerRoot-директиву документации apache.

Ответ Хакре правильный. Я пытался использовать include в разных ситуациях, в консольном скрипте или на веб-сервере. Лучше всего было использовать абсолютный путь, начиная с DOCUMENT_ROOT. Но я все еще застрял из-за этой задней черты. Вот что кажется хорошим решением:

include_once getenv ("DOCUMENT_ROOT"). " ./ WEB-INF / classes

Затем вызовите ваш скрипт с php test.php из пакетного скрипта и поместите значение в переменную enct DOCUMENT_ROOT или нет, с завершающей косой чертой или нет. При загрузке из apache getenv уже заполнен.

PHP-движок может работать с ./ ./, сообщая ему то же, что и ./. Точно так же htdocs./ интерпретируется htdocs / (под окнами)

Старый вопрос, я знаю, но так как это дало мне представление, как решить это для себя, я просто добавлю свое решение здесь. Я хотел определить константу (ROOTPATH) с помощью $ _SERVER ['DOCUMENT_ROOT'] и убедиться, что она имеет завершающую косую черту (DIRECTORY_SEPARATOR).

 define('ROOTPATH', (ctype_alnum(substr($_SERVER['DOCUMENT_ROOT'], -1)) ? $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR : $_SERVER['DOCUMENT_ROOT'])); 

Это предполагает, что последний символ имени папки является буквенно-цифровым (я не мог вспомнить много имен папок, которые заканчиваются специальными символами). Если вы хотите убедиться, что нет косой черты, вы можете пойти примерно так:

 define('ROOTPATH', (!ctype_alnum(substr($_SERVER['DOCUMENT_ROOT'], -1)) ? substr($_SERVER['DOCUMENT_ROOT'], 0, -1) : $_SERVER['DOCUMENT_ROOT'])); 

Мир, Мо