Я использую 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/
есть файлы:
foobar.html
(Английский вариант и по умолчанию)foobar.html.de
(Немецкий вариант).Теперь в коде 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.