Где установить PHP $ _SERVER ['DOCUMENT_ROOT'] Косая черта? - PullRequest
6 голосов
/ 12 марта 2012

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

Ответы [ 7 ]

11 голосов
/ 12 марта 2012

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

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

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

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

4 голосов
/ 01 апреля 2012

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

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

Вместо:

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

Я впервые увидел его в Wordpress-источнике, и мне это очень понравилось, но это может привести к большому количеству повторений "../".

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

2 голосов
/ 04 июня 2014

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

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

require_once( '/'.trim( $_SERVER['DOCUMENT_ROOT'], '/' ).'/'.'constants.php' );
1 голос
/ 12 марта 2012

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

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

0 голосов
/ 20 января 2018

При использовании виртуальных хостов Apache записывает в $_SERVER['DOCUMENT_ROOT'] значение DocumentRoot виртуального хоста.Так что вы можете написать косую черту там.

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

0 голосов
/ 09 декабря 2015

Старый вопрос, я знаю, но так как он дал мне идею, как решить это для себя, я просто добавлю свое решение здесь.Я хотел определить константу (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']));

Peace, Mo

0 голосов
/ 17 декабря 2014

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

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

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

Механизм php может управлять с помощью ././, говоря так же, как ./. Таким же образом htdocs./ интерпретируется как htdocs / (под windows)

...