Как переопределить 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 ответа:
Ну, очевидно, я не совсем правильно задал вопрос. Вот некоторая информация, которую я получил непосредственно от Стефана в списке 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.