强制浏览器清除caching

有没有办法,我可以把一些代码在我的网页上,所以当有人访问一个网站,它会清除浏览器caching,所以他们可以查看更改?

使用的语言:ASP.NET,VB.NET,当然还有HTML,CSS和jQuery。

如果这是关于.css.js更改,则“caching清除”的一种方法是在每个发行版的文件名后添加“ _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. 

你可以看看这个链接 ,看看它是如何工作的。

查看caching控制并过期 META标记。

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT">

另一种常见做法是将不断变化的string附加到所请求文件的末尾。 例如:

<script type="text/javascript" src="main.js?v=12392823"></script>

2012年更新

这是一个老问题,但我认为它需要一个更新的答案,因为现在有一种方法可以更好地控制网站caching。

在脱机Web应用程序 (实际上是任何HTML5网站)中, applicationCache.swapCache()可用于更新网站的caching版本,而无需手动重新加载页面。

这是“使用 HTML5岩石上的应用caching新手指南”中的一个代码示例,解释了如何将用户更新到最新版本的站点:

 // 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 Developer Network上使用应用程序caching以获取更多信息。

2016年更新

networking上的事情变化很快。 这个问题在2009年被问到,在2012年,我发布了一个关于处理问题中描述的问题的新方法的更新。 又过了4年,现在看来已经被废弃了。 感谢cgaldiolo在评论中指出。

目前,截至2016年7月, HTML标准第7.9节“离线Web应用程序”包含弃用警告:

此function正在从Web平台中删除。 (这是一个漫长的过程,需要很多年的时间。)目前使用任何脱机Web应用程序function是非常不鼓励的。 改用服务人员。

那么,在2012年引用的Mozilla开发者networking上使用应用程序caching :

弃用
该function已从Web标准中删除。 尽pipe一些浏览器可能仍然支持它,但它正在被丢弃。 不要在旧的或新的项目中使用它。 使用它的页面或Web应用程序可能随时中断。

另请参见错误1204581 – 如果启用了服务工作人员抓取拦截,则为AppCache添加弃用通知 。

不是这样的。 一种方法是在发送内容时强制浏览器重新加载时发送适当的头文件:

确保所有浏览器都不caching网页。

如果你在这里search"cache header"或类似的东西,你会发现ASP.NET的具体例子。

另一个不太干净的,但有时候,如果你不能控制服务器端的头文件,只是添加一个随机的GET参数到被调用的资源:

 myimage.gif?random=1923849839 

对于静态资源,正确的caching就是使用具有每个部署或文件版本值的查询参数 。 这将在每次部署后清除caching。

 /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" /> 

不要忘记更新程序集版本。

我有一个情况,我会在网上拍照的客户,并需要更新的div如果照片更改。 浏览器仍然显示旧照片。 所以我使用了调用随机GETvariables的方法,每次都是唯一的。 这是它可以帮助任何人

 <img src="/photos/userid_73.jpg?random=<?php echo rand() ?>" ... 

我有类似的问题,这就是我解决它的方法:

  1. index.html文件中,我添加了清单:

     <html manifest="cache.manifest"> 
  2. <head>部分包含更新caching的脚本:

     <script type="text/javascript" src="update_cache.js"></script> 
  3. <body>部分我已经插入了onload函数:

     <body onload="checkForUpdate()"> 
  4. cache.manifest我已经把我想要caching的所有文件。 现在重要的是,它只是通过每次更新“版本”的评论,在我的情况下(阿帕奇)。 也可以使用“?ver = 001”或名称末尾的名称命名文件,但不需要 。 只更改# version 1.01会触发caching更新事件。

     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 

    发生是因为每个“子”文件试图caching页面,而页面已被caching。

  5. 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页面将更新caching。

解决scheme的部分不是我的,但我通过互联网find他们,并把它们放在一起,以便它的工作。

不知道这是否真的可以帮助你,但这就是caching应该如何在任何浏览器上工作。 当浏览器请求文件时,除非有“脱机”模式,否则它总是应该向服务器发送一个请求。 服务器将读取一些参数,如date修改或etags。

服务器将返回NOT MODIFIED的304错误响应,浏览器将不得不使用其caching。 如果etag不在服务器端进行validation,或者修改date低于当前修改date,则服务器应该使用新的修改date或etags或两者返回新内容。

如果没有caching数据发送到浏览器,我猜测行为是不确定的,浏览器可能会或可能不caching文件,不告诉他们如何caching。 如果您在响应中设置了caching参数,它将正确地caching您的文件,然后服务器可能会select返回304错误或新的内容。

这是应该如何做的。 在url中使用随机参数或版本号更像是一个黑客任何东西。

http://www.checkupdown.com/status/E304.html http://en.wikipedia.org/wiki/HTTP_ETag http://www.xpertdeveloper.com/2011/03/last-modified-header-vs-到期报头-VS-ETAG /

看完后我看到还有一个过期的date。 如果您有问题,可能是您设置了过期date。 换句话说,当浏览器将caching你的文件,因为它有一个到期date,它不应该在这个date之前再次请求它。 换句话说,它永远不会问文件到服务器,并永远不会收到一个304没有修改。 它将简单地使用caching,直到达到失效date或caching被清除。

所以,这是我的猜测,你有某种失效date,你应该使用最后修改的etags或混合这一切,并确保没有过期的date。

如果人们往往刷新很多,文件没有改变很多,那么设置一个大的失效date可能是明智的。

我的2分钱!

这里是关于在ASP.NET中设置caching的MDSN页面。

 Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)) Response.Cache.SetCacheability(HttpCacheability.Public) Response.Cache.SetValidUntilExpires(False) Response.Cache.VaryByParams("Category") = True If Response.Cache.VaryByParams("Category") Then '... End If 

我实现了这个适用于我的简单解决scheme(尚未在生产环境中):

 function verificarNovaVersio() { var sVersio = localStorage['gcf_versio'+ location.pathname] || 'v00.0.0000'; $.ajax({ url: "./versio.txt" , dataType: 'text' , cache: false , contentType: false , processData: false , type: 'post' }).done(function(sVersioFitxer) { console.log('Versió App: '+ sVersioFitxer +', Versió Caché: '+ sVersio); if (sVersio < (sVersioFitxer || 'v00.0.0000')) { localStorage['gcf_versio'+ location.pathname] = sVersioFitxer; location.reload(true); } }); } 

我有一个小文件位于的HTML是:

“versio.txt”:

 v00.5.0014 

这个函数在我的所有页面中都被调用,所以在加载时检查localStorage的版本值是否低于当前版本,

 location.reload(true); 

…强制从服务器而不是caching重新加载。

(显然,而不是localStorage,你可以使用cookie或其他持久的客户端存储)

我select这个解决scheme是因为它简单,因为只有维护一个单一的文件“versio.txt”将强制整个网站重新加载。

queryString方法很难实现,也被caching(如果从v1.1更改为先前版本将从caching中加载,那么这意味着caching不刷新,保留所有先前版本caching)。

我是一个小新手,我会apreciate您的专业检查和审查,以确保我的方法是一个好方法。

希望能帮助到你。

很多答案都没有说明问题 – 大多数开发人员都知道,closurescaching效率不高。 但是,在很多情况下,效率并不重要,默认的caching行为被严重破坏。

这些包括嵌套,迭代脚本testing(大的!)和破碎的第三方软件解决方法。 这里给出的解决scheme都不足以解决这种常见的情况。 大多数网页浏览器过于积极的caching,并没有提供明智的手段来避免这些问题。

除了设置Cache-control:no-cache,如果你想每次刷新本地副本(某些版本的IE似乎需要这个),你也应该设置Expires头为-1。

请参阅HTTPcaching – 检查服务器,始终发送If-Modified-Since

有一个技巧可以使用。诀窍是将一个参数/string附加到脚本标记中的文件名,并在文件更改时更改它。

<script src="myfile.js?version=1.0.0"></script>

浏览器将整个string解释为文件path,即使“?” 是参数。 所以现在发生的情况是,当你下一次更新你的文件时,只需要改变你网站脚本标记中的数字(例如<script src="myfile.js?version=1.0.1"></script> ),每个用户浏览器将会看到文件已经改变并抓取一个新的副本。

/custom.js?id=1

为我工作。 通过添加?id=*用户不必按CTRL + F5来刷新caching。

强制浏览器清除caching或重新加载正确的数据? 我已经尝试了大多数在stackoverflow中描述的解决scheme,一些工作,但一段时间后,它最终caching并显示以前加载的脚本或文件。 有没有其他的方法可以清除caching(css,js等),并且可以在所有的浏览器上运行?

到目前为止,我发现如果在服务器上更改文件的date和时间,可以单独重新加载特定的资源。 “清除caching”并不像应该那样容易。 我意识到,“触摸”caching的服务器文件实际上会改变caching在服务器上的源文件的date和时间(在Edge,Chrome和Firefox上testing),大多数浏览器会自动下载最多的目前你的服务器上的最新副本(代码,graphics任何多媒体)。 我build议你在程序运行之前先复制服务器上最新的脚本,然后做“触摸事物”的解决scheme,以便将所有问题文件的date更改为最新的date和时间,然后下载新的副本到您的浏览器:

 <?php touch('/www/sample/file1.css'); touch('/www/sample/file2.js'); ?> 

那么…你的程序的其余部分…

这花了我一些时间来解决这个问题(因为许多浏览器对不同的命令有不同的作用,但是它们都会检查文件的时间,并且在浏览器中比较下载的副本,如果不同的date和时间将会刷新)。不能走正确的道路,总会有另一个更好的解决办法。 最好的问候和愉快的野营。 顺便touch(); 或替代工作在许多编程语言,包括在JavaScript bash sh php中,你可以包括或在HTML中调用它们。

你想清除caching,或只是确保你的当前(改变?)页面没有caching?

如果是后者,则应该如此简单

 <META HTTP-EQUIV="Pragma" CONTENT="no-cache">