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

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

Другие вопросы по тегам