![升级至 12.04 后,带有 Apache MultiViews 的 PHP `virtual()` 无法正常工作](https://linux22.com/image/827253/%E5%8D%87%E7%BA%A7%E8%87%B3%2012.04%20%E5%90%8E%EF%BC%8C%E5%B8%A6%E6%9C%89%20Apache%20MultiViews%20%E7%9A%84%20PHP%20%60virtual()%60%20%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C.png)
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.conf
和deflate.load
),重新加载了 Apache...问题解决了。至少看起来...
编辑:
只有“乱码部分”可以通过禁用来解决mod_deflate
。剩余问题:一旦链接传递到virtual()
触发器mod_negotiation
(即多视图部分),包含的文本被移动到输出的最顶部(即在...前面标签<HTML>
),这会使大多数页面中断。如果目标链接不需要协商,则包含的文本将正确放置。非常令人困惑。