Как переопределить DocumentRoot для каждого запроса, используя VirtualDocumentRoot
Поэтому люди жаловались на то, что PHP-скрипты, использующие DOCUMENT_ROOT, ломаются, когда Apache запускается с VirtualDocumentRoot и mod_vhost_alias, поскольку DOCUMENT_ROOT не устанавливается должным образом. Apache, очевидно, исправил это некоторое время назад, и краткие заметки здесь: http://svn.apache.org/viewvc?view=revision&revision=1132494
К сожалению, недостаточно подробно объясняется, как на самом деле переопределить DocumentRoot для каждого запроса. Я предполагаю, что это должно быть сделано с mod_rewrite, но я не уверен. Кто-нибудь знает как это сделать?
2 ответа
Ну, очевидно, я не совсем задавал правильный вопрос. Вот некоторая информация, которую я получил непосредственно от Стефана в списке Apache2 Bugzilla:
Стефан сказал:
Отчет об ошибке был о VirtualDocumentRoot, и теперь он правильно устанавливает DOCUMENT_ROOT. Поэтому проблема решена.
И я отодвинулся, чтобы уточнить:
Может быть, я что-то пропустил, но я уверен, что я тестировал $_SERVER['DOCUMENT_ROOT'] в php, и он не соответствовал значению, установленному VirtualDocumentRoot. Вы говорите, это должно соответствовать сейчас?
И он ответил:
Да, в 2.4.х. Маловероятно, что исправление когда-либо будет перенесено на 2.2.x, поскольку для него требуется инфраструктура, которая присутствует только в 2.4.
Итак, я запустил apache2 -v и обнаружил, что я не использую 2.4.x. Apache2 -v показывает это:
Server version: Apache/2.2.16 (Debian)
Server built: Nov 30 2012 08:33:45
И если вы заметили, что Сервер был построен в конце ноября этого года, когда я использовал aptitude -install apache2. Я не знаю, если бы apt-get вытащил Apache 2.4 вместо этого. Это очень отстойно. 2.4.3 стабильная была выпущена в августе. Я не знаю, почему aptitude вытащил 2,2, но это действительно создало для меня кошмар.
Так что на самом деле вопрос, который я задал, был спорным. Все должно было работать нормально, за исключением того, что aptitude установил устаревший apache2, и я не понял, что происходит. Больше нет ошибок.
mod_vhost_alias - единственный модуль в официальном дистрибутиве, который устанавливает корень документа для каждого запроса.
Предварительно существующий код, включая код, который устанавливает переменную окружения DOCUMENT_ROOT CGI, который ищет корень документа с помощью ap_document_root(r), видит эти изменения.
Это изменение также вводит новую концепцию для таких модулей, как mod_userdir, где "корень документа" не совсем подходит. Эта новая концепция имеет новые API и новые переменные среды CGI (CONTEXT_PREFIX, CONTEXT_DOCUMENT_ROOT), которые не привязаны к традиционному корню документа.
Единственный настоящий документ, который я считаю подходящим:
- документ для разработчиков (в основном сделано)
- документ для мигрирующих людей, которые видят DOCUMENT_ROOT, установленный mod_vhost_alias
- CGI / переменная окружения doc о новых переменных CONTEXT_*
Но я не вижу в этом ничего, что оставляло бы вещи "сломанными", поскольку mod_vhost_alias и существующие переменные API DocumentRoot и переменные среды работают вместе.
Если вопрос действительно "как" за пределами mod_vhost_alias, посмотрите на разницу между mod_userdir и mod_vhost_alias относительно ap_set_document_root() и ap_set_context_info(), а затем посмотрите, как это приводит к переменным среды CGI в файле server/util_script.c.