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 文件时发生的情况。