AlexanderTsymbal
@AlexanderTsymbal
tsymbal.su

Почему в переменной $_SERVER['DOCUMENT_ROOT'] папка другого сайта?

Добрый день. Есть сайт domain.ru. Перенес его копию на поддомен test.domain.ru . Там определение некоторых констант завязано на переменной $_SERVER['DOCUMENT_ROOT'] . Сайт открывается с основного домена. Проверил содержимое $_SERVER, и увидел там странную штуку:
[DOCUMENT_ROOT] => /var/www/www-root/data/www/domain.ru
но в то же время
[HTTP_HOST] => test.domain.ru
[SCRIPT_FILENAME] => /var/www/www-root/data/www/test.domain.ru/index.php

Как такое могло случиться? Куда копать? Подскажите, товарищи!

==========МОЁ РЕШЕНИЕ==========
Ввиду нижеизложенного, определил для себя единственное подходящее решение: переопределить константы без использования переменной окружения DOCUMENT_ROOT. Т.е. задал ручками просто прямой путь до поддомена вида /var/www/.../.../.../test.domain.ru/. Т.к. универсального решения нет.

СПАСИБО ВСЕМ!
  • Вопрос задан
  • 4129 просмотров
Решения вопроса 2
Wolfnsex
@Wolfnsex Куратор тега PHP
Если не хочешь быть первым - не вставай в очередь!
Не знаю как сейчас, но лет эдак 5 назад, я помню, у Apache'а было 2 режима работы на эту тему:
а) Нормальный режим
б) Режим автоматического создания поддоменов на основе файловой системы (т.е. создаёте папку - она становится поддоменом)

В режиме "Б" была такая особенность, что при создании поддомена таким образом, физически в конфигурации сервера этого поддомена не присутствовало, вернее будет сказать, он наследовал все настройки родительского домена, от того и DOCUMENT_ROOT и некоторые другие настройки, могли туда попасть из домена-родителя.
Ответ написан
Переменная $_SERVER заполняется на основе информации, полученной от сервера.

В случае Nginx это встроенные переменные, которые задаются через директиву fastcgi_param.
$document_root — значение директивы root или alias для текущего запроса.
$realpath_root — абсолютный путь, соответствующий значению директивы root или alias для текущего запроса, в котором все символические ссылки преобразованы в реальные пути.

В вашем случае нужно переопределить DOCUMENT_ROOT на уровне location: (пример)
fastcgi_param DOCUMENT_ROOT $realpath_root;

Из-за таких особенностей на DOCUMENT_ROOT обычно не завязываются, задавая директорию для ROOT иначе.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
slo_nik
@slo_nik Куратор тега PHP
Добрый день.
Из официальной документации
'DOCUMENT_ROOT'
Директория корня документов, в которой выполняется текущий скрипт, в точности та, которая указана в конфигурационном файле сервера.

'SCRIPT_FILENAME'
Абсолютный путь к скрипту, который в данный момент исполняется.

'HTTP_HOST'
Содержимое заголовка Host: из текущего запроса, если он есть.

В конфигурации указана domain.ru вот Вы и получаете её в $_SERVER['DOCUMENT_ROOT']
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы