有没有一种方法可以在我的网页上放置一些代码,以便当有人访问该网站时,清除浏览器缓存,这样他们就可以查看更改内容了?
使用的语言: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.
你可以查看这个链接,了解它如何工作。script.js?v=1.2
。(或者如果你没有跟踪版本,只需使用文件的最后修改时间,这更容易实现)。不确定前面的评论者是否是指这个方法! - Doin这是一个旧问题,但我认为它需要更加现代的答案,因为现在有一种方法可以更好地控制网站缓存。
在离线Web应用程序(实际上是任何HTML5网站)中,可以使用applicationCache.swapCache()
来更新您网站的缓存版本,而无需手动重新加载页面。
这是来自HTML5 Rocks应用缓存入门指南的代码示例,解释了如何将用户更新到您网站的最新版本:
// 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);
Web技术发展迅速。
这个问题是在2009年提出的,2012年我发布了一个有关该问题描述的新方法。又过了4年,现在看来它已经被弃用了。感谢cgaldiolo在评论中指出这一点。
截至2016年7月,HTML标准第7.9节“离线Web应用”包含一个废弃警告:
此功能正在从Web平台中删除。 (这是一个需要多年时间的漫长过程。)目前高度不建议使用任何离线Web应用功能。 相反,应使用服务工作者。
所以,我在2012年提到的Mozilla开发者网络上的应用缓存使用也是如此:
已弃用
此功能已从Web标准中删除。 虽然某些浏览器仍可能支持它,但它正在被删除过程中。不要在旧项目或新项目中使用它。使用它的页面或Web应用程序随时可能会崩溃。
另请参见Bug 1204581 - 如果启用服务工作者获取拦截,请添加有关AppCache的弃用通知。
另请参见Mozilla开发者网络上的应用缓存使用以获取更多信息。
并不是这样的。一种方法是在传递内容时发送适当的头信息,以强制浏览器重新加载:
如果您在SO上搜索“cache header”或类似的内容,您将找到ASP.NET特定的示例。
另一种不太干净但有时是唯一的方法(如果无法控制服务器端的头信息),是向调用的资源添加一个随机的GET参数:
myimage.gif?random=1923849839
我遇到了类似的问题,以下是我的解决方法:
在index.html
文件中,我添加了清单文件:
<html manifest="cache.manifest">
在 <head>
部分包含更新缓存的脚本:
<script type="text/javascript" src="update_cache.js"></script>
在<body>
部分,我插入了一个onload函数: <body onload="checkForUpdate()">
在cache.manifest
中,我已经放置了我想要缓存的所有文件。现在重要的是,它在我的情况下(Apache)只需每次更新“版本”注释即可正常工作。另外,将文件命名为带有“?ver=001”或类似结尾的东西也是一种选择,但不是必需的。只需更改# version 1.01
就会触发缓存更新事件。
CACHE MANIFEST
# version 1.01
style.css
imgs/logo.png
#all other files
在index.html中仅仅包含1、2和3点是很重要的。否则。
GET http://foo.bar/resource.ext net::ERR_FAILED
发生这种情况是因为每个“子”文件在页面已经被缓存的同时尝试缓存该页面。
在update_cache.js
文件中,我放置了以下代码:
function checkForUpdate()
{
if (window.applicationCache != undefined && window.applicationCache != null)
{
window.applicationCache.addEventListener('updateready', updateApplication);
}
}
function updateApplication(event)
{
if (window.applicationCache.status != 4) return;
window.applicationCache.removeEventListener('updateready', updateApplication);
window.applicationCache.swapCache();
window.location.reload();
}
现在你只需要更改文件,在清单中更新版本注释。现在访问index.html页面将更新缓存。对于静态资源来说,正确的缓存方式是使用查询参数,并将值设置为每个部署或文件版本的版本号。这将在每次部署后清除缓存。
/Content/css/Site.css?version={FileVersionNumber}
这里是ASP.NET MVC的例子。
<link href="@Url.Content("~/Content/Css/Reset.css")?version=@this.GetType().Assembly.GetName().Version" rel="stylesheet" type="text/css" />
不要忘记更新程序集版本。
?version=@ViewContext.Controller.GetType().Assembly.GetName().Version
- CGodo目前,许多网络浏览器都支持使用 Clear-Site-Data
HTTP 头部 [MDN 参考]。为了指示客户端的网络浏览器清除网站域名和子域名的缓存,请在来自服务器的 HTTP 响应中设置以下头部:
Clear-Site-Data: "cache"
或者,以下标头可能在各种浏览器中得到更好的支持,但它除了缓存之外还会清除其他网站数据,例如localStorage和cookies。
Clear-Site-Data: "*"
然而请注意,中间缓存(例如CDN)可能无法理解或尊重此标头,因此中间缓存仍可能响应以前缓存的数据。
我曾经遇到一个问题,就是在网上为客户拍照之后,需要更新div,但浏览器仍然显示旧的照片。所以我使用了一种方法来调用随机GET变量,这将每次都是唯一的。如果有帮助,以下是代码:
<img src="/photos/userid_73.jpg?random=<?php echo rand() ?>" ...
编辑 正如其他人指出的那样,以下是更高效的解决方案,因为它只会在图像更改时重新加载图像,并通过文件大小识别此更改:
<img src="/photos/userid_73.jpg?modified=<? filemtime("/photos/userid_73.jpg")?>"
Clear-Site-Data
HTTP头部;有关详细信息,请参阅此答案。 - undefined