用dnn做的一个网站,前一天还很正常,第二天访问时有时出现乱码,有时下载的的页面只显示出一部分,查看源代码,发现html文件没有下载完。
很是奇怪,因为没有做其它什么操作,怎么会出现这个问题呢?刚开始怀疑是不是文件编码或者皮肤编码的问题,经过检查发现全部采用的UTF-8编码,没有问题。使用HttpLook抓取数据包,发现Content-Type中的编码也是UTF-8,也没有问题。
奇怪的是采用FireFox3显示却是正常的。
在捣鼓了半天后,几乎排除了所有可能造成乱码的地方。
在百思不得其解的时候,突然想到是否是IE进行Html文件解析的时候在碰到某种编码的字符后进行了转换。
于是在Default.aspx中强行加上<meta http-eqiv="ContentType" content="text/html,charset=UTF-8" />
这时候发现确实不会乱码,但是奇怪的是页面还是无法显示完。总是只显示了一部分页面。感觉是Web服务器只发送了部分数据过来就中止。就象我们有时候写Response.End那种感觉,在发送了部分数据后就中止了后面的处理。
于是又分析了半天后,想到在DNN主机设置中设置了一些参数,例如为了提高网络性能进行的页面压缩。有可能是解压的时候发生的错误。
把压缩方式改为无后,尽然立刻变得正常了。
心中在想,因为主机采用的是Gzip的压缩方式,莫非dnn的Gzip压缩方式有bug?
再回到主页查看的时候,发现页面尾部莫名的多了个网络警察的图标,连接地址是福建网络警察的网址。
查看html源码发现在</html>后面插入了一段代码。
<center><div class='xmga_layer'><a href='http://www.xiamen.cyberpolice.cn/' target='_blank'><img border='0' width='38' height='38' src='http://www.xiamen.cyberpolice.cn/image/gt.gif' /></div></center>
这下载恍然大悟了!
原来问题尽然是因为网警(或者主机供应商)强行在页面中插入了链接图标的html代码。
可是令人气愤的是,他们估计在网关中截获http协议,如果是html文件就在后面插入这段代码,但是他们却没有分析内容是否加密或者进行了压缩。这样它把内容插入进来后,ie进行解压翻译的时候自然就会出现错误。
问题终于解决!
再此,记录下这个问题,希望帮助碰到这个问题的朋友,以为这种问题很难发现。例如,如果网警实在internet网关中进行的处理,那么你在本地访问是发现不来问题的,只有远端的用户才会发现问题,然后客户打电话给你,说访问你们的网站乱码了,结果你在本地搞了半天都没有发现乱码。绝对想不到问题出在哪里。当然如果你知道会在web网关或者其它传输中插入这个东西,当然就知道问题所在了!
ps:
1.但是奇怪的是firefox却能正确解析,这个还不知道什么原因。
2.后来我试者把压缩方式改为deflate,发现firefox3尽然提醒不支持该编码模式,而ie却可以。看来firefox3不支持deflate编码,感觉奇怪,因为这个编码也是很普遍的啊?