随机查询字符串,以避免IE缓存

时间:2009-08-05 16:13:34

标签: html query-string

一个众所周知的问题是,即使向每个页面提供Cache-Control: no-cacheLast-Modified标头,IE也会缓存太多的html。

当使用查询字符串获取动态信息时,这种行为确实令人不安,因为IE认为它是同一页(即:http://example.com/?id=10)并提供缓存版本。

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

有更好的选择吗?是否有另一种更清洁的方式来实现这一目标?我知道POST未缓存,但在此处使用GET语义上是正确的。

6 个答案:

答案 0 :(得分:11)

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

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

比使用.getJson或.get要多一些代码(虽然不多)但是会干净地解决问题,而不会附加随机数。

答案 1 :(得分:6)

您还可以使用当前的Unix时间(以毫秒为单位)来避免一秒钟内出现许多请求的问题(在一毫秒内发出多个请求的可能性要小得多)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

所以,最后,唯一可行的方法(感谢IE6)是使用a random, 要么 time bound 查询字符串。

你可以使用 time bound querystring 只会每15秒(或任何其他时间)更改,因此您可以降低服务器命中数,因为您会在15秒内看到本地缓存的内容。

如果你有 a standard compliant browser,你只能使用而逃脱 ETags

答案 4 :(得分:0)

我有同样的问题,但请注意,一秒钟内可能会有很多请求。这就是我使用它的原因:

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

答案 5 :(得分:0)

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

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

另请参阅HTTP RFC section on ETag