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

10

В различных серверных средах 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.

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


Для справки:

  • 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);
Дом
источник
4
Вы могли бы просто использовать $realpath = realpath($_SERVER['DOCUMENT_ROOT']);. Он автоматически удаляет все множественные слэши, а также завершающий. Если вы всегда хотите использовать косую черту, соедините ее с результатом вышеупомянутого вызова realpath(). Не внутри.
грипп
1
Я могу подтвердить ту же проблему (php 5.5) между хостом Hosteurope (Ubuntu, я думаю): есть косая черта ... и Windows 7: нет косой черты (довольно недавняя установка XAMPP)
Франк Нок
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'должно быть немного быстрее, чем все, что может сделать realpath.
Фрэнк Нок
3

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

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

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

veidelis
источник
2

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

$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'])."/";

чертополох

антонио
источник
1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'должно быть немного быстрее, чем все, что может сделать realpath.
Фрэнк Нок
2

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

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

Бен Смит
источник
1

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

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

апаш

DocumentRoot /var/www/html

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

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

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

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

И безопасно игнорировать это?

Энтони Гиббс
источник