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

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

virtual()我经常在自己的一个网站上使用 PHP指令,包括核心元素。在过去的大约 10 年里,它运行良好 — — 但在升级(或者说是迁移,因为它在新机器上)到 Ubuntu 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()功能基本上可以正常工作——但语言相关的东西显然不再像以前那样与它一起工作了。

由于上面提到的“二进制乱码”让我感到好奇,我将其复制粘贴到名为的文件中foo.gz,然后运行gzip -d foo.gz。正如已经怀疑的那样,这没有产生任何错误消息(尽管输出仍然是乱码——只是不同的乱码)。将/etc/apache2/mods-enabled新机器上的与旧机器上的类似设置进行比较,发现mod_deflate新机器上已启用。因此,我从启用的模式中删除了它(只需删除符号链接),重新加载了 Apache……问题似乎解决了:PHPvirtual现在包含了正确的语言变体。但是 Firefox 现在拒绝显示框架集(如果调用virtual()在替代部分),但只是表现得好像不再支持它们——尽管它们在源代码中显示正常(Ctrl——U但包含的“虚拟”文件的内容移到了标签前面<HEAD>!)。再次尝试使用框架集中的完整文件名virtual("central/foobar.html")再次被正确解释(并且包含的​​内容位于正确的位置)。

我现在完全糊涂了。

当然,我尝试寻找一些变化,经常使用谷歌,也在这里搜索问题——不幸的是无济于事。

最后:问题

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

答案1

我认为您的问题在于 apache 配置。

故障排除提示:
  - 检查 mod_negotiation 是否已加载
  - 检查多视图选项是否已启用
  - 默认将语言等标头映射到 mod_mime 已知的内容,因此请检查您是否有如下内容:
    添加 .de 语言
    添加语言 en .en
  - 检查浏览器在标头中发送的内容。尝试使用 curl 复制它

备择方案:
  - 使用 mod_rewrite 将 URL 重写为正确的文件,虚拟调用应该可以工作。
  - 尝试手动配置 mime 映射:
    AddHandler 类型映射变量
    创建一个名为 foobar.var 的文件,内容如下:
    URI: foobar.html
    内容类型:text/html
    内容语言: en

    URI: foobar.html.de
    内容类型:text/html
    内容语言:de

    检查访问 foobar.var 文件时发生的情况。

相关内容