Как переопределить DocumentRoot на основе каждого запроса с помощью VirtualDocumentRoot


Поэтому люди жаловались на то, как PHP-скрипты, использующие DOCUMENT_ROOT, ломаются, когда Apache запускается с VirtualDocumentRoot и mod_vhost_alias, поскольку DOCUMENT_ROOT не устанавливается должным образом. Апач очевидно исправил это некоторое время назад и краткие заметки здесь: http://svn.apache.org/viewvc?view=revision&revision=1132494

К сожалению, недостаточно подробно объясняется, как на самом деле переопределить DocumentRoot на основе каждого запроса. Я предполагаю, что это должно быть сделано с помощью mod_rewrite как-то, но я не уверен. Кто-нибудь знает, как это сделать?

2 3

2 ответа:

Ну, очевидно, я не совсем правильно задал вопрос. Вот некоторая информация, которую я получил непосредственно от Стефана в списке apache2 Bugzilla:

Стефан сказал:

Сообщение об ошибке было о VirtualDocumentRoot, и это теперь устанавливает DOCUMENT_ROOT правильно. Поэтому вопрос решен.

И я отодвинулся, чтобы уточнить:

Может быть, я что-то пропустил, но я почти уверен, что проверил $_SERVER ['DOCUMENT_ROOT'] в php и он не совпадал набор значений по VirtualDocumentRoot. Ты хочешь сказать, что теперь они должны совпадать?

И он ответил:

Да, в 2.4.x. очень маловероятно, что исправление когда-либо будет перенесено на 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-установите apache2. Я не знаю, если бы apt-get вытащил apache 2.4 вместо этого. Это очень неубедительно. 2.4.3 stable был выпущен в августе. Я не знаю, почему aptitude вытащил 2.2, но это действительно создало кошмар для меня.

Так что на самом деле вопрос, который я задал, был спорным. Все должно было работать нормально, за исключением того, что aptitude установил устаревший apache2, и я не понимал, что происходит. Нет больше никакого жука.

Mod_vhost_alias-единственный модуль в официальном дистрибутиве, который устанавливает корневой каталог для каждого запроса.

Уже существующий код, включая код, задающий переменную окружения DOCUMENT_ROOT CGI, который ищет корень документа через ap_document_root (r), видит эти изменения.

Это изменение также вводит новую концепцию для модулей, таких как mod_userdir, где "корень документа" на самом деле не подходит. Эта новая концепция имеет новые API и новые переменные среды CGI (CONTEXT_PREFIX, CONTEXT_DOCUMENT_ROOT), которые не привязаны к традиционному корню документа.

Единственный реальный документ, который я считаю уместным, это:

  • doc для разработчиков (в основном сделано)
  • doc для мигрирующих пользователей, которые видят DOCUMENT_ROOT, установленный mod_vhost_alias
  • CGI / environment variable doc о том, что такое новые переменные CONTEXT_*

Но, я не вижу их как todos, как оставляющие вещи "сломанными", так как mod_vhost_alias и существующий DocumentRoot Переменные API и среды работают вместе.

Если вопрос действительно " как " вне mod_vhost_alias, посмотрите на разницу между mod_userdir и mod_vhost_alias по отношению к ap_set_document_root () и ap_set_context_info (), а затем посмотрите, как они приводят к переменным среды CGI в server/util_script.c.