有没有办法我可以把一些代码在我的网页,所以,当有人访问网站,它清除浏览器高速缓存,所以他们可以查看的变化?

语言的使用:ASP.NET,VB.NET当然HTML,CSS,并!

有帮助吗?

解决方案

如果这是关于.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.

您可以看看这个链接来看看它是如何工作的可能

其他提示

看看 cache-control过期 元的标签。

<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年

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

离线网应用程序 (这是真的任何HTML5网站) applicationCache.swapCache() 更新可以使用缓存的版本的网站而不需要手动重新载入页面。

这是一种代码的例子 初学者指南使用的应用缓存 在HTML5岩石,说明如何更新,用户对最新版本的网站:

// 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);

也参看 使用的应用缓存 在Safari开发网络的更多信息。

更新2016

事情变化的很快在网。这个问题是问在2009年和2012年,我发布了一个更新关于一种新的方式来处理所述问题在这个问题。另一个4年过去了,现在看来,它是已经废弃。谢谢来 cgaldiolo 指出它的意见。

目前,七月2016年, HTML标准,第7.9、离线网应用程序 包括一个折旧警告:

这个特征的过程中被删除的网络平台。(这是一个长期的过程,需要许多年。) 使用任何 离线网应用程序的功能在这一时间是非常气馁。使用服务工作人员代替。

所以不会 使用的应用缓存 在Safari开发者的网络,我引用在2012年:

弃用
这个特点已经从该网络的标准。虽然一些浏览器可能仍然支持它,它是在这个过程中的 正在下降。不要使用它,在新的或旧的项目。网页或网络应用程序 使用它可能会破坏在任何时间。

也参看 错误1204581-添加一个过时的通知AppCache如果服务工作人员取拦截启用.

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

确保网页是不是缓存,在所有浏览器。

如果您对"cache header"或类似这里因此,一些搜索,你会发现ASP.NET具体的例子。

另一个不那么干净,但有时只有这样,如果你无法控制在服务器侧的标头,被添加随机GET参数到被称为资源:

myimage.gif?random=1923849839

有关的静态资源右缓存。将使用查询参数使用的每个部署或文件版本值。这将对每个部署后清除缓存的作用。

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

不要忘记更新组件版本。

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

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

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

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

    <body onload="checkForUpdate()">
    
  4. cache.manifest 我已经放置了所有要缓存的文件。现在重要的是,它在我的情况(Apache)中只需更新每次“版本”注释即可工作。也可以选择使用“?ver=001”或名称末尾的其他内容来命名文件,但它是 不需要. 。改变只是 # version 1.01 触发缓存更新事件。

    CACHE MANIFEST
    # version 1.01
    style.css
    imgs/logo.png
    #all other files
    

    包括 1., 2. 很重要。和 3.点 仅有的 在index.html中。否则

    GET http://foo.bar/resource.ext net::ERR_FAILED
    

    发生这种情况是因为每个“子”文件都尝试在页面已被缓存时缓存该页面。

  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页面将更新缓存。

解决方案的各个部分不是我的,但我通过互联网找到了它们并将它们组合在一起,以便它可以工作。

我在那里我将采取客户的照片在网上,如果照片被改变将需要更新DIV的情况下。浏览器仍然显出老照片。所以我用调用一个随机变量GET,这将是独一无二的每一次的黑客。这是,如果它可以帮助任何人

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

EDIT 如其他人指出的那样,以下是更有效的解决方案,因为它会重新加载图像时,才发生变化,识别由文件大小这一变化:

<img src="/photos/userid_73.jpg?modified=<? filemtime("/photos/userid_73.jpg")?>"

很多答案都缺少了这一点 - 大多数开发人员都知道,关闭缓存是低效的。然而,有许多共同的情况下,其中效率是不重要的,默认缓存行为是严重破坏。

这包括嵌套的,反复的测试脚本(大一个!),并打破第三方软件的解决方法。这里给出的解决方案都不是足以解决这些常见的场景。大多数Web浏览器都远远过于激进缓存并且不提供任何显手段来避免这些问题。

不知道这可能会真正帮助你,但是这就是缓存应该如何在任何浏览器中运行。当浏览器请求的文件,它应该总是发送一个请求到服务器,除非有一个“离线”模式。服务器将读取像修改日期或ETag的一些参数。

服务器将返回一个错误304响应于未被修改,并且浏览器将不得不使用它的高速缓存。如果ETAG不会在服务器端验证或修改的日期是当前修改日期下面,服务器将返回新修改日期或ETag的或两者的新内容。

如果有发送给浏览器没有缓存的数据,我猜的行为是不确定的,浏览器可能会或可能不会缓存文件不知道他们是如何缓存。如果您在响应中设置缓存参数,它会正确地缓存文件,然后服务器可以选择返回一个304错误,或者新的内容。

这是它应该怎么做。在URL中使用随机params中,版本号更像是一个黑客比什么。

http://www.checkupdown.com/status/E304.html http://en.wikipedia.org/wiki/HTTP_ETag HTTP://www.xpertdeveloper。 COM / 2011/03 /上次修改报头-VS-到期报头-VS-ETAG /

看完后我看到也有一个到期日期。如果你有问题,它可能是你有一个到期日期设置。换句话说,当浏览器会缓存文件,因为它有一个截止日期,它不应该有在该日期之前再次提出要求。换句话说,它绝不会要求文件到服务器,绝不会收到一个304没有改变。它将简单地使用高速缓存,直到达到终止日期或缓存被清除。

所以这是我的猜测,你有某种到期日的,你应该使用最后一次修改的ETag或者这一切的混合,并确保没有过期日期。

如果人们倾向于刷新了很多,该文件没有得到很大的变化,那么它可能是明智的,设置一个大的到期日。

我2美分!

更新的URL以下工作对我来说:

/custom.js?id=1

通过?id=后添加一个唯一编号,并增加它的新变化,用户不必按CTRL + F5刷新缓存。可替代地,可以追加的当前时间散列或字符串版本或?id=后历元

喜欢的东西?id=1520606295

我实现了这个简单的解决方案对我的作品(尚未在生产环境中):

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);

...强制从服务器重载从代替高速缓存中。

(显然,代替的localStorage的可以使用cookie或其它持久客户机存储装置)

我选择了这种溶液对于它的简单,因为只有mantaining单个文件“versio.txt”将迫使完整的网站来重新加载。

查询字符串的方法是难以落实,也缓存(如果从V1.1到以前的版本将改变从缓存中加载,那么就意味着高速缓存不对齐,保持所有先前版本的高速缓存)。

我有点新手,我想apreciate你的专业检查和审查,以确保我的方法是一个很好的方法。

希望它能帮助。

有一个技巧,可以招,低脂就是一个参数/字符串附加到文件名的脚本标记并更改它,当你的文件的更改。

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

在浏览器解释整个字符串作为文件路径,即使发生什么后“?”为参数。所以笏发生,现在是,未来当你更新你的文件时,只需更改在您的网站上(例<script src="myfile.js?version=1.0.1"></script>)脚本标记的数量和每个用户的浏览器将看到该文件已经修改,并抓住新的副本。

强制浏览器清除缓存或重新加载正确的数据?我已经试过最计算器,一些工作描述的解决方案,但过了一会儿,它确实缓存最终并显示前面加载脚本或文件。是否有将清除缓存(CSS,JS等),实际上对所有的浏览器?另一种方式

我发现到目前为止,如果你更改日期和时间上的文件服务器上的特定资源可以单独重新加载。 “清除缓存”并不容易,因为它应该是。相反,在我的浏览器清除缓存的,我意识到,“感人的”缓存实际上会改变服务器上的源文件缓存的日期和时间,服务器上的文件(测试边缘,Chrome和Firefox)和大多数浏览器会自动下载最的什么是您的服务器上当前最新副本(码,图形任何多媒体太)。我建议你刚才复制的服务器上的最新剧本的“做触摸事” 程序前解决方案运行,所以它会将所有有问题的文件的日期更改为最当前的日期和时间,然后下载一个新的副本到浏览器:

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

然后......你的程序的其余部分...

我花了一些时间来解决这个问题(因为许多浏览器的行为不同,以不同的命令,但文件的所有检查时间,并在浏览器中比较你下载的副本,如果不同的日期和时间,将做刷新) ,如果你不能去的应该正确的方式,总会有另一个可用的和更好的解决之道。最好的问候和快乐露营。顺便说触摸();或替代方案在许多编程语言的工作包括在JavaScript庆典SH PHP和您可以包括或打电话给他们在HTML中。

是否要清除高速缓存,或者只是确保您的当前页面(改变?)不被缓存?

如果是后者,它应该是一样简单

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top