【问题标题】:Chrome (and possibly other browsers) caching my script includeChrome(可能还有其他浏览器)缓存我的脚本包括
【发布时间】:2011-11-15 18:57:16
【问题描述】:

问题:

我在客户的网站上托管一个小部件,该小部件对于网站上的每个页面都会有所不同。

为了呈现小部件,客户端在其页面上包含一个脚本标签。该脚本标记会为网站上的每个页面加载,它返回的代码取决于页面。

因此,如果此脚本被缓存,最终结果是我们为错误页面提供了一个小部件。

现在,当我们提供脚本时,我们在响应头中设置

缓存控制:max-age=0 过期时间:过去 24 小时

但有时浏览器仍会缓存脚本。

问题:

有没有办法在所有情况下都使用 http 标头来停止缓存,还是我们必须采取完全不同的方法?

更新:

topek 推荐的标头大大提高了脚本的不可缓存性。但是,(再次在 Chrome 中似乎是最具缓存攻击性的)当使用后退、前进或重新加载按钮时,脚本仍会被缓存。如果你真的点击任何东西,它将从服务器获取。

似乎停止缓存的唯一万无一失的方法是设置保证每次页面加载都不同的脚本源(正如 esilija 和 tejs 所建议的那样)。

【问题讨论】:

  • 为什么不在 js url 请求中包含一个随机查询字符串参数呢?或者附上日期时间之类的?
  • 附加一个随机无意义的查询字符串.. 像这样:script.js?14091341049134。从+new Date 生成数字,每毫秒变化一次。
  • 如果需要,我们可以这样做。然而,我们喜欢只要求我们的客户包含一个脚本标签的简单性。我想我们可以要求他们包含几行 js 来代替你的建议。

标签: javascript caching node.js http-caching


【解决方案1】:

这两个标题应该可以解决问题:

response.setHeader("Cache-Control", "no-cache, must-revalidate");
response.setHeader("Expires", "Sat, 26 Jul 1997 05:00:00 GMT");

或者您根据当前页面设置名称,例如当用户请求页面http://domain/posts/1 时,脚本名称可能是http://domain/script/scriptname/posts/1。通过方法,脚本仍然可以每页缓存。

不要在脚本上附加查询字符串,例如script.js?random_string。代理不能很好地使用这种方法。如果您想在名称中放置一个随机字符串,请将其放在 .js 之前,例如 script-0934234234.js 并在您的服务器上重写请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 2015-06-12
    • 2011-11-25
    • 2019-07-09
    • 2011-01-10
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    相关资源
    最近更新 更多