我们能否通过某些代码强制清除浏览器缓存?

4
我们正在进行一个与静态资源相关的项目,为了使页面加载更快,我们大量使用浏览器缓存。现在我们面临的问题是每次更新静态内容(如css或js),用户会抱怨出现一些问题。我知道用户可以手动清除缓存并获取正确的内容。但是难道不可能在更新文件时,它自己加载新版本吗?我们使用的是带有WAMP的PHP。

更改名称(通过附加随机字符串)的替代方法是告诉服务器发送与缓存相关的HTTP头并控制缓存。但真正最好的方法是不要更改文件,即使让文件更加稳定。 - poke
嘿Poke,我相信我正在寻找你指向的解决方案。你能给我一些关于它的方向吗?我该如何让我的浏览器发送缓存相关的头文件,以便加载更新版本的文件。 - sushil bharwani
请参考Gary Green的下面的答案,那基本上就给了你基础知识。然后,您可以通过.htaccess设置标题,甚至可以通过在php文件中包装文件并在之前使用header(...)发送缓存头来设置标题。 php手册中header条目的评论也很好地概述了如何设置与缓存相关的标题。 - poke
4个回答

3
首先,这取决于您设置了多长时间的expires头 - 一天?一周?一个月?
无论您何时设置了过期头,都必须等到时间到期之前,浏览器才会开始联系服务器获取新版本。因此,正如其他人指出的那样,您将不得不更改url。 然而,对于您来说,还有另一个好选择,为将来做准备... 如果您设置了'cache-control: "no-cache, must-revalidate"'和短的过期时间,则浏览器每次想要重新显示缓存对象时都会与服务器进行检查,使用"If-Modified-Since"请求头发送您的服务器最初在其“Last-Modified”响应头中发送的上次时间戳。如果自客户端发送的时间戳以来已更新该对象,则服务器将发送新对象和新的Last-Modified时间戳头。否则,它将只响应“304-未修改”的响应头。
因此,重新验证的优点是您仍然可以在很少风险的情况下节省一些带宽,而客户端显示 "过时 "对象的可能性很小,但缺点是客户端必须等待,而您的服务器会检查客户端的 If-Modified-Since 标头与文件的 "Last-Modified" 时间戳,当然,服务器必须实际检查文件系统以获取该 "Last-Modified" 时间。因此,所保存的只是实际内容传输带宽和传输时间。

好的阅读资源:


2

强制用户重新加载静态资源的最快最简单的方法是在其后添加查询字符串参数,例如,如果您的脚本是

<script type="text/javascript" src="myscript.js"></script>

需要让用户重新加载吗?在链接后面添加?v=2即可。
<script type="text/javascript" src="myscript.js?v=2"></script>

又更新了?

<script type="text/javascript" src="myscript.js?v=3"></script>

etc.


事实上,这就是Stack Overflow的做法:http://sstatic.net/stackoverflow/all.css?v=82a4a8691f11 - AgentConundrum

0

你可以使用一个技巧来强制浏览器加载更新版本的css/js文件。

假设你的文件名为“layout.css”(或“common.js”),那么包含该文件的语法是

<link rel="stylesheet" href="/layout.css">

聪明的部分是在文件名的末尾添加查询字符串,例如:
<link rel="stylesheet" href="/layout.css?version=1">

所以每次更改您的js / css文件时 - 添加一个与之前不同的查询字符串(我认为最好的方法是每次更改内容时递增版本号)。


0

您可以通过重命名静态文件或者添加时间戳来强制用户重新下载静态文件,例如:

<img src="logo.png?212312313"/>

每次更改时间戳,用户就会重新下载新文件。这可以通过检查文件修改时间或手动添加随机字符串(可能是版本号)来自动化服务器端。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接