2009-08-05 66 views
10

即使给每页提供Cache-Control: no-cacheLast-Modified标题,IE也缓存太多的html是一个众所周知的问题。随机Querystring避免IE缓存

这behaiviour与查询字符串努力让动态信息时,因为IE认为它是同一页(即:http://example.com/?id=10),并提供缓存的版本实在是令人担忧。

我已经解决了它添加一个随机数或时间字符串到查询字符串(as others have done)这样的http://example.com/?id=10&t=2009-08-06_13:12:56,我只是忽略serverside。

有更好的选择吗?还有其他更简洁的方法来实现这一点吗?我知道POST没有被缓存,但在这里使用GET在语义上是正确的。

+0

我在问:有没有其他方法可以做到这一点? – voyager 2009-08-05 16:27:37

+0

顺便说一句,你的断言是不正确的。 IE不会“缓存太多的HTML”。有关IE中缓存的讨论,请参阅www.fiddler2.com/redir/?id=httpperf。 – EricLaw 2010-04-05 21:38:06

+1

@Eric,IE有一些意外/不一致[行为](http://support.microsoft.com/kb/222064/)[关于缓存](http://support.microsoft.com/kb/234067)。 – voyager 2010-04-05 21:55:17

回答

2

那么,到底是使用 random, 或 time bound 查询字符串的唯一可靠的方式做到这一点(感谢IE6)。

你可以使用一个 time bound querystring 仅更改每15秒(或任何其他的时间),所以你会降低服务器的命中次数,因为你会看到本地缓存的内容对于那些15秒。

如果你有 a standard compliant browser,你可以只使用 ETags脱身。

+0

如果用户使用后退按钮返回到页面并在页面上进行刷新,则这又会失败。你是否能够找到一种在所有情况下都能正常工作的解决方案?谢谢。 – lostInTransit 2009-09-18 14:02:03

+0

您可以使用JavaScript客户端生成查询字符串的“随机”部分,如http://stackoverflow.com/questions/1234246/random-querystring-to-avoid-ie-caching/1234260#1234260那样,它将会不同*每次*完成get或post。 – voyager 2009-09-18 14:18:43

+0

“......(感谢IE6)是......”也感谢IE7,我还没有测试IE8。 – 2010-06-08 12:41:03

0

我有同样的问题,但保重,在一秒钟内可以有很多请求。这就是为什么我用这个:

$.getJSON("http://server/example?param=value&dummy=" + Math.random(), ...); 
+0

嗯,我不想**相同的客户端**打我的服务器**几个计时器每秒**,所以我不介意,如果信息显示是1秒老。当然,输出对于人类来说是纯文本的。 – voyager 2009-08-05 16:18:46

2

的查询字符串使用随机数(不时间戳),或实际更改文件名是推荐的两种方法。 Steve Souders和YAHOO!'s performance group已经发布了他们在优化世界上访问量最大的房产之一时发现并开发的有用信息和实践的

6

您也可以使用当前Unix的时间以毫秒为单位,以避免在一秒钟内的许多要求的问题(这是很可能在一毫秒的多个请求要少得多)

var url = "http://whatever.com/stuff?key=value&ie=" + (new Date()).getTime(); 
0

您是否尝试过加入ETag响应中的标题? 您可以使用随机的一个或生成的页面的校验和,以便在适当时提供缓存版本。

我不确定IE的行为是什么,但最近的版本应该可以工作。

又见HTTP RFC section on ETag

11

假设您使用的是jQuery,而不是使用$ .get或$ .getJson,请使用更通用的$ .ajax并显式将缓存值设置为false。下面是一个例子:

$.ajax({ 
     url: "/Controller/Action", 
     cache: false, 
     type: "GET", 
     dataType: "json", 
     success: function(data, textStatus) { 
         alert("success"); 
       } 
    }); 

需要多一点代码(未虽然多)比使用.getJson或。获得,但将干净地解决问题而不附加随机数。

+0

我得到发现,在IE浏览器中使用GET请求,我们应该设置不缓存的HTML和我设置'缓存:假',并阻止IE从缓存带来的结果..感谢 – Lucky 2013-07-01 06:53:34