Назад | Перейти на главную страницу

Несогласованная косая черта в конце переменной DOCUMENT_ROOT в PHP при использовании Apache

В разных серверных средах PHP $_SERVER['DOCUMENT_ROOT'] super global иногда имеет завершающую косую черту, а иногда нет. Я бы подумал, что эта проблема напрямую связана с тем, как Apache DocumentRoot определяется в httpd.conf файл:

т.е. я бы подумал, что если httpd.conf не содержит завершающей косой черты:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current
    ...

затем echo $_SERVER['DOCUMENT_ROOT'] должен дать / var / www / live / current

и если httpd.conf содержит косую черту в конце:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current/
    ...

затем echo $_SERVER['DOCUMENT_ROOT'] должен дать / var / www / live / current /

Так обстоит дело в Ubuntu 10.04, но в RHEL 5.5 в конце добавляется косая черта. $_SERVER['DOCUMENT_ROOT'] даже если ничего не было определено на Apache.

Есть идеи, почему это происходит? Есть ли параметр конфигурации, который мне не хватает?


Для справки:

Понятия не имею, почему между вашими виртуальными хостами меняется косая черта. Кстати, это важно? Просто добавьте новую косую черту в свои программы (удалите ее, если присутствует двойная косая черта), и проблема будет решена.

я использую

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

Корень документа в среде Apache может быть определен более чем в одном месте.

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

Я предлагаю вам проверить конфигурацию vhost под vhosts.d и sites-available каталоги.

http://httpd.apache.org/docs/2.0/mod/core.html говорит: DocumentRoot следует указывать без косой черты в конце.

Предлагаемое решение:

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

не работает во всех установках.

Например, в моем случае:

$_SERVER['DOCUMENT_ROOT']  = "/www/site/"
$_SERVER['DOCUMENT_ROOT']."/" = "/www/site//"
realpath("/www/site//") = "/www/site"
str_replace("//", "/", "/www/site") = "/www/site"

Та же проблема, что и раньше.

Возможно, вам стоит изменить первую инструкцию в:

$realpath = realpath ($_SERVER['DOCUMENT_ROOT'])."/";

чертополох

Ответ Дома - это решение этой проблемы, однако заявление Стефанвески является причиной того, почему в разных средах вы сталкиваетесь с двойным "//". На вашем локальном компьютере в вашем .conf файле, где вы настраиваете свой виртуальный хост, вы, скорее всего, добавили / в конце определенного корня документа, в то время как человек, который настраивал вашу другую среду, этого не сделал, или наоборот.

В любом случае, при использовании php $ _SERVER ['DOCUMENT_ROOT'] вы получите значение среды apache, которое является результатом конфигурации. Это причина появления символа «/» в одной среде и символа «//» в другой.

Я бы сказал, что предполагается, что DOCUMENT_ROOT не имеет завершающей косой черты.

Это значение передается из конфигурации веб-сервера.

Apache

DocumentRoot /var/www/html

Это означает, что мы должны добавить косую черту к пути.

Зная, что двойная косая черта '//' в любом месте пути не имеет последствий (когда это связано с файловой системой ... в URL-адресе http, могут быть случаи, когда есть некоторые сбои)

$ cat /etc//issue Debian GNU/Linux 9 \n \l

Когда после DOCUMENT_ROOT стоит косая черта, мы можем обвинить системного администратора в том, что не имеет никаких последствий :)

И смело игнорировать это?