В разных серверных средах 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 стоит косая черта, мы можем обвинить системного администратора в том, что не имеет никаких последствий :)
И смело игнорировать это?