Gzip导致页面和编码错误
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 不管这些,能解压的就解压,没压缩的就不解压,所以能够正常显示。
至于为什么部分用户的博客首页可以打开,而另一部分不可以,有一个细节值得关注:所有不能打开的用户的首页都添加了在线音乐播放器这个功能,不出意外的话,问题应该出在这个播放器的代码上。
目前只是猜测,具体原因将在下次技术部开会时再探讨。
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »