Назад | Перейти на главную страницу

PHP `virtual ()` с Apache MultiViews не работает после обновления до Ubuntu 12.04

Я использую PHP virtual() директивы довольно много на одном из моих сайтов, включая центральные элементы. Это работало нормально последние ~ 10 лет, но после обновления (или, точнее, перехода, как на новой машине) до Ubuntu 12.04, как-то сломалось.

Пример настройки (упрощенный)

Чтобы облегчить понимание, я упрощаю некоторые вещи (содержание). Скажем, мне нужен фрагмент HTML, например <P>For further instructions, please look <A HREF='foobar'>here</P> на нескольких страницах. 10 лет назад я использовал для этого SSI, поэтому он помещается в файл в центральном месте - так что если, например, целевой URL меняется, мне нужно обновить его только в одном месте. Чтобы обслуживать несколько языков, у меня есть MultiViews включен - и в $DOCUMENT_ROOT/central/ есть файлы:

Теперь в коде PHP я просто поместил:

<? virtual("/central/foobar"); ?>

и пусть Apache предоставит правильный языковой вариант.

Эта проблема

Как уже говорилось, это работало нормально около 10 лет: немецкие посетители получали немецкий вариант, все остальные - английский (в зависимости от предпочитаемого языка). Но после обновления до Ubuntu 12.04 он больше не работал: либо ничего не было доставлено из virtual() команда, или (в связи с наборами фреймов) это даже закончилось бинарной тарабарщиной.

Пытаясь понять, что происходит, я играл со многими вещами. Я сначала подумал MultiViews был (как-то) недоступен, но звонил http://<server>/central/foobar показал правильный вариант, в зависимости от настроенных языковых предпочтений. Это также доказало, что с правами доступа к файлам все в порядке. В error.log также не дал никаких подсказок (не было выдано сообщение об ошибке).

Наконец, в качестве «последнего пересмотра» я изменил команду PHP на <? virtual("central/foobar.html"); ?> - и этот самый файл фактически был включен. Итак, PHP virtual() функция в основном работала, но явно зависящие от языка вещи больше не работали вместе с ней, как раньше.

Поскольку упомянутая выше "двоичная тарабарщина" вызвала у меня любопытство, я скопировал ее в файл с именем foo.gz, и побежал gzip -d foo.gz. Как уже предполагалось, это не привело к сообщению об ошибке (хотя вывод все еще был тарабарщиной - просто другой тарабарщиной). Сравнивая /etc/apache2/mods-enabled на моей новой машине с аналогичной настройкой на старой машине появился mod_deflate на новой машине. Поэтому я удалил это из включенных модов (просто удалив символические ссылки), перезагрузил Apache ... проблема казалась решенной: PHP virtual теперь включен правильный языковой вариант. Но Firefox теперь отказывается отображать наборы фреймов (если virtual() call был в альтернативной части), но просто ведет себя так, как будто больше не поддерживает их - хотя они отлично отображаются в источнике (Ctrl-U - но при перемещении содержимого включенного «виртуального» файла перед <HEAD> тег!). Повторная попытка с полным именем файла в virtual("central/foobar.html") набор фреймов снова был интерпретирован правильно (и включенный контент находится в правильном месте).

Я совершенно запуталась.

Конечно, я пытался найти какие-то изменения, много использовал Google, а также искал здесь вопросы - к сожалению, безрезультатно.

Наконец: вопрос

Отложив «вопросы дизайна» в сторону (конечно, сегодня я бы спроектировал вещи по-другому, но, по крайней мере, сейчас я упускаю время, чтобы изменить это для довольно большого количества страниц): Что можно сделать, чтобы он снова заработал? Я наверняка что-то пропустил - но не могу понять, что ...


I believe your problem to be the apache configuration.

Troubleshooting tips:
  - check if mod_negotiation is loaded 
  - check that Multiview Option is enabled 
  - The default is to map headers like the language to something known by mod_mime, so check you have stuff like:
    AddLanguage de .de
    AddLanguage en .en
  - check what your browser is sending in the headers. Try duplicating it with curl

Alternatives:
  - Use mod_rewrite to rewrite the URL to the correct file and the virtual calls should work.
  - Try configuring the mime map manually:
    AddHandler type-map var
    Create a file named foobar.var with the following content:
    URI: foobar.html
    Content-Type: text/html
    Content-Language: en

    URI: foobar.html.de
    Content-Type: text/html
    Content-Language: de

    Check what happens when you access the foobar.var file.