升级至 12.04 后,带有 Apache MultiViews 的 PHP `virtual()` 无法正常工作

升级至 12.04 后,带有 Apache MultiViews 的 PHP `virtual()` 无法正常工作

virtual()我经常在自己的一个网站上使用 PHP指令,包括核心元素。在过去的 10 年里,这个指令运行良好 —— 但升级到 12.04 后,它不知怎么就坏了。

示例设置(简化)

为了便于理解,我简化了一些内容。比如说,我需要一个 HTML 片段,就像<P>For further instructions, please look <A HREF='foobar'>here</P>多个页面中的片段一样。10 年前,我为此使用了 SSI,因此它被放在一个中心位置的文件中——因此,如果目标 URL 发生变化,我只需要在一个地方更新它。为了提供多种语言,我启用了 Apache——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()命令中),经常使用 Google,也在这里搜索问题——不幸的是无济于事。

最后:问题

把“设计问题”放在一边(今天我肯定会以不同的方式设计东西 - 但至少目前我错过了对大量页面进行更改的时间):怎样才能让它再次发挥作用?我确实错过了一些东西——但我不知道是什么......

添加(编辑)

我现在剩下的问题是,只要文档需要协商(例如,有不同的语言变体),virtual()总是将内容添加到生成的文档的最开始(即标签前面<HTML>)——无论它被放在哪里。然而,当不涉及协商时,它会被正确放置。

知道那里发生了什么事吗?如何解决?

答案1

由于上面提到的“二进制乱码”让我感到好奇,我进一步调查了一下,将其复制粘贴到名为的文件中foo.gz,然后运行gzip -d foo.gz。正如已经怀疑的那样,这没有产生任何错误消息(尽管输出仍然是乱码——只是不同的乱码)。将/etc/apache2/mods-enabled新机器上的与旧机器上的类似设置进行比较,结果发现mod_deflate在新机器上启用。所以我从启用的模块中删除了它(只需删除符号链接deflate.confdeflate.load),重新加载了 Apache...问题解决了。至少看起来...

编辑:

只有“乱码部分”可以通过禁用来解决mod_deflate。剩余问题:一旦链接传递到virtual()触发器mod_negotiation(即多视图部分),包含的文本被移动到输出的最顶部(即在...前面标签<HTML>),这会使大多数页面中断。如果目标链接不需要协商,则包含的文本将正确放置。非常令人困惑。

相关内容