代码之家  ›  专栏  ›  技术社区  ›  Esteban Küber

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

  •  10
  • Esteban Küber  · 技术社区  · 15 年前

    IE缓存过多的HTML是一个众所周知的问题,即使在 Cache-Control: no-cache Last-Modified 每个页面的标题。

    当使用querystrings获取动态信息时,这种行为是非常麻烦的,因为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 回复  |  直到 8 年前
        1
  •  11
  •   Simon Fox    14 年前

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

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

    需要的代码比使用.getjson或.get多一点(虽然不多),但可以在不添加随机数的情况下彻底解决问题。

        2
  •  6
  •   Sinan Taifour    15 年前

    您还可以使用当前的UNIX时间(毫秒)来避免一秒钟内出现多个请求的问题(一毫秒内不太可能有多个请求)。

    var url = "http://whatever.com/stuff?key=value&ie=" + (new Date()).getTime();
    
        3
  •  2
  •   Rex M    15 年前

    建议对querystring使用随机数(不是时间戳),或者实际更改文件名。Steve Souders和 YAHOO!'s performance group 发表了一篇文章 在优化世界上访问量最大的酒店之一的同时,他们发现并开发了有用的信息和实践。

        4
  •  2
  •   Community Egal    7 年前

    因此,最终,唯一可靠的方法是使用 random , 或 time bound 查询字符串。

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

    如果你有 a standard compliant browser ,您只需使用 ETags .

        5
  •  0
  •   FWH    15 年前

    我也有同样的问题,但要小心,一秒钟内可能会有很多请求。这就是我为什么要用这个:

    $.getJSON("http://server/example?param=value&dummy=" + Math.random(), ...);
    
        6
  •  0
  •   filippo    15 年前

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

    我不知道IE的行为是什么,但是对于最新版本,它应该起作用。

    也见 HTTP RFC section on ETag