我在我的一个站点上使用了PHP的virtual()指令,包括中心元素。 这在过去的10年里工作得很好 – 但是在升级之后(或者在新机器上移动)到Ubuntu 12.04之后,它不知何故就被打破了。
为了便于理解,我简化了一些东西(内容)。 所以说,我需要一个像<P>For further instructions, please look <A HREF='foobar'>here</P>这样的HTML片段。 <P>For further instructions, please look <A HREF='foobar'>here</P>在多个页面<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注意提供正确的语言变体。
如前所述,这项工作十年来一直很顺利:德国游客得到了德国的变体,其他的都是英语(取决于他们的首选语言)。 但升级到Ubuntu 12.04后,它不再有效: virtual()命令没有提供任何东西,或者(与framesets有关)甚至以二进制乱码结束。
试图弄清楚会发生什么,我玩了很多东西。 我首先想到MultiViews (不知何故)不再可用 – 但调用http://<server>/central/foobar显示正确的变体,取决于configuration的语言首选项。 这也certificate了文件权限没有问题。 error.log也没有提供任何线索(没有错误信息)。
最后,就像“最后一次重复”一样,我把PHP命令改成了<? virtual("central/foobar.html"); ?> <? virtual("central/foobar.html"); ?> 这个文件实际上是包含在内的。 所以PHP的virtual()函数基本上可以工作 – 但是语言依赖的东西显然不再像之前一样工作了。
由于上面提到的“二进制乱码”让我好奇,我把它复制到一个名为foo.gz的文件中,并运行gzip -d foo.gz 正如已经怀疑,这没有产生错误信息(虽然输出仍然是胡言乱语 – 只是不同的胡言乱语)。 将新机器上/etc/apache2/mods-enabled的/etc/apache2/mods-enabled与旧机器上的类似设置进行比较后,新机器上启用了mod_deflate 。 所以我从启用的mods(通过简单地删除符号链接)中删除了,重新加载的Apache …问题似乎解决了:PHP的virtual现在包括正确的语言变体。 但是Firefox现在拒绝显示框架集(如果virtual()调用是在替代部分),但只是performance得好像不再支持它们 – 尽pipe它们在源代码中显示得很好( Ctrl – U – 但是具有包括在<HEAD>标签前移动的“虚拟”文件内容!)。 在virtual("central/foobar.html")再次尝试完整的文件名,框架集被再次正确解释(并且包含的内容在正确的位置)。
我现在完全困惑。
当然,我试图find一些改变,使用谷歌很多,也在这里search的问题 – 不幸的是无济于事。
把“devise问题”放在一边(当然,今天我会devise一些不同的东西 – 但至less现在我错过了时间来改变这个相当大的页面): 可以做些什么使它重新工作? 我肯定错过了一些东西 – 但我无法弄清楚…
我相信你的问题是Apache的configuration。
故障诊断技巧
- 检查是否加载了mod_negotiation
- 检查Multiview选项是否启用
- 默认情况下,将语言头像映射到mod_mime已知的东西,所以检查你有像这样的东西:
AddLanguage de .de
AddLanguage en .en
- 检查浏览器在标题中发送的内容。 尝试用curl复制它
备择scheme:
- 使用mod_rewrite重写URL到正确的文件,虚拟调用应该工作。
- 尝试手动configurationMIME映射:
AddHandler type-map var
使用以下内容创build一个名为foobar.var的文件:
URI:foobar.html
内容types:文本/ HTML
内容语言:en
URI:foobar.html.de
内容types:文本/ HTML
Content-Language:de
检查当你访问foobar.var文件时会发生什么。