Непоследовательная косая черта в переменной DOCUMENT_ROOT в PHP при использовании Apache
В разных серверных средах PHP $_SERVER['DOCUMENT_ROOT']
супер глобальный иногда имеет косую черту, а иногда нет. Я бы подумал, что эта проблема напрямую связана с тем, как 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.
Есть идеи, почему это происходит? Есть ли параметр конфигурации, который мне не хватает?
Для справки:
- PHP 5.3.3 RHEL (проблема возникает): PHP 5.3.3 (cli) (сборка: 23 июля 2010 г. 16:26:53)
- PHP-версия Ubuntu (без проблем): PHP 5.3.2-1ubuntu4.2 с Suhosin-Patch (cli) (сборка: 13 мая 2010 г., 20:03:45)
6 ответов
Я понятия не имею, почему слэш меняется между вашими виртуальными хостами. Кстати, это важно? Просто добавьте новую косую черту в свои программы (удалите, если присутствует двойная косая черта), и проблема решена.
я использую
$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);
http://httpd.apache.org/docs/2.0/mod/core.html говорит: DocumentRoot должен быть указан без завершающей косой черты.
Корень документа в среде Apache можно определить более чем в одном месте.
Да, httpd.conf
содержит эти настройки, но они могут быть перезаписаны, так как этот файл используется для конфигурации по умолчанию.
Я бы посоветовал вам проверить конфигурацию Vhost в vhosts.d
а также sites-available
каталоги.
Предлагаемое решение:
$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'])."/";
чертополох
Ответ Dom является решением этой проблемы, однако заявление Стефанвески - причина того, почему в разных средах вы испытываете двойное "//". На вашем локальном компьютере в вашем файле.conf, в котором вы настраивали виртуальный хост, вы, скорее всего, добавили / в конец определенного корня документа, а тот, кто настраивал вашу другую среду, - нет, или наоборот.
В любом случае, при использовании php's $_SERVER['DOCUMENT_ROOT'] вы получаете значение среды apache, которое является результатом конфигурации. Это причина для "/" в одной среде и "//" в другой.
Я бы сказал, что предполагается, что DOCUMENT_ROOT не имеет косой черты.
Это значение передается из конфигурации веб-сервера
апаш
DocumentRoot /var/www/html
Это означает, что у нас должен быть начальный слеш к пути, который мы добавляем к нему.
Зная, что двойная косая черта "//" в любом месте пути не имеет никакого значения (применительно к файловой системе... в URL-адресе http, могут быть случаи, когда есть некоторые глюки)
$ cat /etc//issue
Debian GNU/Linux 9 \n \l
Когда есть косая черта в DOCUMENT_ROOT, мы можем обвинить сисадмина в том, что не имеет никакого значения:)
И безопасно игнорировать это?