解决IE 6的缓存bug

标签:无

今天在写YUI的缓存部分时,遇到了IE 6的一个bug(我没有IE 7+,所以没有测试更高的版本,但以下都简称IE),在这记录一下。

在实现AJAX应用时,大多数人都遇到过这个IE的缓存bug,那就是本应该发送的HTTP请求,会因为IE的缓存策略,直接返回缓存里的数据,而不访问服务器。
这在部分时候是很高效的,但如果返回的结果是动态变化的话,IE的这个策略就会让你头疼了。

一般的实现都是加个随机的参数,例如时间或随机数,这样IE就会被迫发送HTTP请求了。
不过这个办法治标不治本,看上去也不优雅,所以我还是从HTTP协议入手,准备根治IE的这个毛病。

看了RFC 2616后发现,很多HTTP头都是和缓存打交道的。

其中最重要的就是Cache-Control和Pragma,当它们的值为no-cache时,就可以强制让用户代理不进行缓存。
而前者适用于HTTP 1.1,后者适用于HTTP 1.0。

加上这2个头后,我发现在GAE服务器上确实不会缓存了,但在本地开发服务器上(localhost)测试时仍会出现这个问题。
搜索了一下后,发现微软写的一篇《HOWTO:防止在 Internet Explorer 中进行缓存》,文中提到可以将Expires设为-1,以保证IE不会使用缓存中的过期数据。
RFC 2616中也的确提到了这个做法,并说明不符合RFC 1123日期格式时,特别是0,都应当成已过期来处理。
于是我测试了0和-1,发现有一定效果,但没有根除。原因就是IE会在约1秒后才过期,而不是立即过期。

不过RFC 2616里还提到要保证过期的话,可以将它设为和Date一致。
只是我懒得去计算时间,所以就用这样一个常数来代替了:'Fri, 01 Jan 1990 00:00:00 GMT'。

经过这样一番折腾,IE终于屈服了,真够让人吐血的。

0条评论 你不来一发么↓

    想说点什么呢?