有没有办法可以在我的页面上放置一些代码,这样当有人访问一个站点时,它会清除浏览器缓存,以便他们可以查看更改?
使用的语言:ASP.NET、VB.NET,当然还有 HTML、CSS 和 jQuery。
如果这是关于 .css
和 .js
的更改,那么“缓存破坏”的一种方法是在每个版本的文件名中附加“_versionNo
”之类的内容。例如:
script_1.0.css // This is the URL for release 1.0
script_1.1.css // This is the URL for release 1.1
script_1.2.css // etc.
或者在文件名之后执行:
script.css?v=1.0 // This is the URL for release 1.0
script.css?v=1.1 // This is the URL for release 1.1
script.css?v=1.2 // etc.
您可以查看此 link 以了解它是如何工作的。
查看 cache-control 和 expires META 标签。
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT">
另一种常见做法是将不断变化的字符串附加到请求文件的末尾。例如:
<script type="text/javascript" src="main.js?v=12392823"></script>
2012 年更新
这是一个老问题,但我认为它需要一个更新的答案,因为现在有一种方法可以更好地控制网站缓存。
在 Offline Web Applications(实际上是任何 HTML5 网站)中,applicationCache.swapCache()
可用于更新您网站的缓存版本,而无需手动重新加载页面。
这是 HTML5 Rocks 上 Beginner's Guide to Using the Application Cache 中的代码示例,解释了如何将用户更新到您网站的最新版本:
// Check if a new cache is available on page load.
window.addEventListener('load', function(e) {
window.applicationCache.addEventListener('updateready', function(e) {
if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
// Browser downloaded a new app cache.
// Swap it in and reload the page to get the new hotness.
window.applicationCache.swapCache();
if (confirm('A new version of this site is available. Load it?')) {
window.location.reload();
}
} else {
// Manifest didn't changed. Nothing new to server.
}
}, false);
}, false);
另请参阅 Mozilla 开发者网络上的 Using the application cache 了解更多信息。
2016 年更新
网络上的事情变化很快。这个问题是在 2009 年提出的,在 2012 年我发布了一个关于处理问题中描述的问题的新方法的更新。又过了 4 年,现在看来它已经被弃用了。感谢 cgaldiolo 在评论中指出这一点。
目前,截至 2016 年 7 月,HTML Standard, Section 7.9, Offline Web applications 包含一个弃用警告:
此功能正在从 Web 平台中删除。 (这是一个需要很多年的漫长过程。)此时强烈建议不要使用任何离线 Web 应用程序功能。改为使用服务人员。
我在 2012 年引用的 Mozilla 开发者网络上的 Using the application cache 也是如此:
已弃用 此功能已从 Web 标准中删除。尽管某些浏览器可能仍然支持它,但它正在被删除。不要在旧项目或新项目中使用它。使用它的页面或 Web 应用程序可能随时中断。
另见Bug 1204581 - Add a deprecation notice for AppCache if service worker fetch interception is enabled。
不是这样的。一种方法是在交付内容时发送适当的标头以强制浏览器重新加载:
Making sure a web page is not cached, across all browsers.
如果您在 SO 上搜索 "cache header"
或类似内容,您将找到 ASP.NET 特定示例。
如果您无法控制服务器端的标头,另一种不太干净但有时唯一的方法是向正在调用的资源添加随机 GET 参数:
myimage.gif?random=1923849839
我有类似的问题,这就是我解决它的方法:
在 index.html 文件中,我添加了清单: 在
部分包含更新缓存的脚本:
script.js?v=1.2
。 (或者,如果您不跟踪版本,只需使用文件上次修改时间,这更容易做到)。不知道前面的评论是不是这个意思!