Gzip导致页面和编码错误

2009-12-21T15:29:00

Blog.ecjtu.net 的问题已经出现好几天了,一直没有时间仔细研究。具体表现为某些用户的博客首页无法打开,而大部分用户的博客首页可以正常打开。最近两天,听博客管理员说报告此类错误的用户越来越多,所以今天我仔细查找了一下原因。

该博客系统使用的是 SupeSite/X-Space,由 Ucenter 和论坛整合而成,服务器是 FreeBSD,前端使用 Nginx,后端使用 Apache 运行 php(暂时是这样,准备年后换为 FastCGI)。

使用 IE6 访问整个网站是正常的,但使用非 IE6 的浏览器,如 IE7、IE8、FireFox、Chrome 等浏览器打开时,部分用户的首页无法打开,会出现如下情况:

FireFox 无法访问时的错误提示

Chrome 无法访问时的错误提示

IE 可以正常访问

一开始我以为是 Rewrite 的问题,尝试了好几种 Rewrite 方法,但问题依旧存在。后来注意到所有的 Rewrite 重定向都会回到一个文件 iframe.php 上,并且所有无法访问用户的首页几乎都是类似于 http://blog.ecjtu.net/iframe.php?uid=92649 的样式。接着,我开始仔细分析这个 iframe.php 文件。

以下是 iframe.php 文件的内容:

<?php 
/*
[SupeSite/X-Space] (C)2001-2006 Comsenz Inc.
$RCSfile: iframe.php,v $
$Revision: 1.3 $
$Date: 2007/08/01 08:11:21 $
*/
include_once('./include/main.inc.php'); 
include_once(S_ROOT.'./language/batch.lang.php'); 
dbconnect(); 
$_GET['uid'] = intval($_GET['uid']); 
$reauthcode = md5($_SCONFIG['sitekey'].$_GET['uid']); 
$s_url = S_URL; 
if($_GET['passpage'] == 1) { 
    echo '<script language="javascript" type="text/javascript">location.href="'.S_URL.'/index.php?uid-'.$_GET['uid'].'-noframe-1";</script>'; 
    exit; 
} else { 
    $newurl = S_URL."/batch.common.php?action=musicpasspage&uid=$_GET[uid]&hash=$reauthcode"; 
} 
if(empty($newurl)) { 
    $display = 'none'; 
} else { 
    $display = ''; 
} 
$space = getuserspace($_GET['uid']); 
print <<<EOF 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=$_SCONFIG[charset]"> 
<title>$space[spacename] Power by X-Space</title> 
<script> 
function framebutton(){ 
    var obj = document.getElementById('navigation'); 
    var musicobj = document.getElementById('topFrame'); 
    var frameswitch = document.getElementById('frameswitch'); 
    var switchbar = document.getElementById('switchbar'); 
    if(obj.style.width == '1px'){ 
        obj.style.width = '192px'; 
        musicobj.style.width = '192px'; 
        switchbar.style.left = '192px'; 
        frameswitch.style.backgroundPosition = '0'; 
        frameswitch.src = '$s_url/images/flashplayer/btn_hide.jpg'; 
    } else { 
        obj.style.width = '1px'; 
        musicobj.style.width = '1px'; 
        switchbar.style.left = '1px'; 
        frameswitch.style.backgroundPosition = '-11'; 
        frameswitch.src = '$s_url/images/flashplayer/btn_show.jpg'; 
    } 
} 

if(top!= self) { 
    top.location = self.location; 
} 
</script> 
</head> 
<body style="height: 100%; margin: 0; padding: 0;" scroll="no"> 
<table width="100%" height="100%" cellspacing="0" cellpadding="0" border="0"> 
<tr> 
    <td id="navigation" style="width:1px; height:200px; url($s_url/images/flashplayer/bg_framebottom.jpg) no-repeat left bottom; vertical-align:top; "> 
        <iframe src="$newurl" frameborder="0" scrolling="no" style="width:1px; height:100% ;" name="topFrame" id="topFrame"></iframe> 
    </td> 
    <td style="height: 100%;width: 100%;"> 
        <table id="switchbar" width="14" height="100%" cellspacing="0" cellpadding="0" border="0" style="position: absolute; left: 1px; background-repeat: repeat-y; background-position: -192px; repeat-y left center;"> 
        <tbody> 
        <tr> 
            <td onClick="framebutton()" style="display:$display"><img id="frameswitch" border="0" src="images/flashplayer/btn_show.jpg" style="background-position: 0pt 50%;"/></a></td> 
        </tr> 
        </tbody> 
    </table> 
    <iframe style="height: 100%; width: 100%; " src="$s_url/index.php?uid-$_GET[uid]-noframe-1" name="mainFrame" frameborder="0" scrolling="yes"></iframe> 
</td> 
</tr> 
</table> 
</body> 
</html> 
EOF; 
?> 

但是经过一番分析和测试之后,基本可以确定这个文件没有问题。无意间注意到 Firefox 和 Chrome 的错误提示:

Chrome 的错误提示

错误 330 (net::ERR_CONTENT_DECODING_FAILED):未知错误。

Firefox 的错误提示

无法显示您尝试查看的页面,因为它使用了无效或者不支持的压缩格式。

因为没有读过这个 X-Space 的代码,所以不敢百分之百确定原因。不过就目前的所有现象来看,最有可能出问题的还是这个 Iframe.php 文件,尤其是最后那个 iframe 标签。简单来说,客户端接收到的内容部分是 Gzip 压缩的,所以像 Firefox、Chrome 这样符合标准的浏览器会提示内容错误不可靠。而 IE6 不管这些,能解压的就解压,没压缩的就不解压,所以能够正常显示。

至于为什么部分用户的博客首页可以打开,而另一部分不可以,有一个细节值得关注:所有不能打开的用户的首页都添加了在线音乐播放器这个功能,不出意外的话,问题应该出在这个播放器的代码上。

目前只是猜测,具体原因将在下次技术部开会时再探讨。

当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »