【发布时间】:2013-12-05 13:02:01
【问题描述】:
情况如下:
我得到一个 js 来监控网络广告。由于浏览器缓存,当我在服务器端更新 js 时,客户端上的 js 不会立即刷新。如何在我更新 js 后立即强制刷新客户端 js服务器端?
附言添加版本号策略在我的情况下没有用。
【问题讨论】:
标签: javascript browser
情况如下:
我得到一个 js 来监控网络广告。由于浏览器缓存,当我在服务器端更新 js 时,客户端上的 js 不会立即刷新。如何在我更新 js 后立即强制刷新客户端 js服务器端?
附言添加版本号策略在我的情况下没有用。
【问题讨论】:
标签: javascript browser
简单的策略 - 将版本号作为查询字符串添加到您的 js 文件中,然后更改版本号。这将导致浏览器再次获取您的 js 文件 -
<script src="mysource.js?version=123"></script>
每当您在服务器上更改脚本时,也要在 html 中更改此版本号。或者更好的是,每次请求此脚本时应用一个随机数作为 version 值。
【讨论】:
您可以使用 HTTP 的 cache-control mechanisms 来控制浏览器的缓存。
在提供 JS 文件的副本时,请在响应中包含 ETag 和/或 Last-Modified 标头。还包括一个“Cache-Control: must-revalidate”标头。这告诉浏览器它必须每次都与服务器进行检查,并且它可以在以后的请求中发送If-None-Match 和/或If-Modified-Since 标头,要求服务器仅在文件发生更改时才发送文件。
如果您想避免浏览器每次检查服务器的负载,并且更改不会立即生效也可以,您还可以在当前时间和 @987654328 中包含 Date 标头@ 标头设置为将来的某个时间点——可能是 12 或 24 小时。这允许浏览器在指定的时间内使用其缓存副本,然后再与您的服务器进行核对。
HTTP 的缓存控制功能非常强大,但也有很多细微差别,例如对中间缓存的控制(例如,在您的服务器和用户浏览器之间 的其他系统)。您将需要全面了解caching in HTTP,而不仅仅是我提到的特定标头字段。
【讨论】:
您可以通过更改文件名来做到这一点。添加一些版本号(可能类似于参数,例如,对于 PHP,filename.js?v=time();)或者只是在文件名的末尾附加一些随机数。
其实我不确定你是否可以强制客户端刷新这种类型的文件。但是在更改文件名时,您将强制浏览器获取最新版本。
【讨论】: