浏览器中的缓存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浏览器中的缓存相关的知识,希望对你有一定的参考价值。

参考技术A 在我们使用浏览器访问网页的过程中,浏览器经常会缓存各种网页中的内容。当再次访问同一个网页时,可以发现部分内容是从缓存直接读取的。
查看HTTP的响应信息,就能发现一些端倪。比如响应 200 from cache; 304 not modify 等等。
下面对浏览器使用缓存的各种情形做一下分析:

Pragma是HTTP 1.0版本的一个参数,在HTTP 1.1版本里面这个参数也会生效,如果不想浏览器缓存网页的内容,可以在 Response header 里面加上 :Pragma: no-cache。

Cache-Control是HTTP 1.1版本新增的一个参数。

Cache-Control:no-store 不允许缓存

Cache-Control:no-cache 不允许直接使用缓存,需要先发起请求和服务器协商(这个经常被误认为是不允许缓存,实际上它的作用是让浏览器在使用缓存前先请求服务端一次,确认内容是否有更新)

这样的响应代表没有跟服务端进行交互,内容是直接从本地读取的。

Expires和Cache-control: max-age= 有类似的作用,都是指定缓存内容的有效周期,Expires指定的格式是格林威治时间,max-age则是秒数。

服务端也可以在 Response header 里加上 Last-Modified,它的格式是格林威治时间,再次请求时,浏览器的 Request header 中会多出一个叫 If-Modified-Since的值,通过比较这两个值是否一致来决定是否返回304。

ETag的用法和 Last-Modified 类似,值是一种文件指纹。比如:ETag:"5a3ccff0-5dc"。
服务端在 Response header 里加上 ETag,再次请求时,浏览器的 Request header 中会多出一个叫 If-None-Match的值,通过比较这两个值是否一致来决定是否返回304。

总体来说,浏览器使用缓存时有两种表现:
1.直接从本地读取,不与服务端有交互,就是 200 OK (from memory cache)。
2.请求一次服务端,查看本地缓存是否生效,这种方式叫 协商缓存。如果服务端判断缓存有效,将不返回完整内容,而是返回 304 Not Modified。

在优先级上 Pragma > Cache-Control > Expires。

ASP.NET 应用程序中的浏览器缓存

【中文标题】ASP.NET 应用程序中的浏览器缓存【英文标题】:Browser Caching in ASP.NET application 【发布时间】:2010-10-31 15:29:07 【问题描述】:

关于如何在 asp.net 应用程序中进行浏览器缓存的任何建议。我在网上找到了一些不同的方法,但不确定哪种方法最好。具体来说,我想缓存我的 CSS 和 JS 文件。它们确实会发生变化,但是,通常最多每月一次。

【问题讨论】:

看到这个问题:***.com/questions/914027/… 【参考方案1】:

另一种技术是将静态图像、css 和 js 存储在正确设置了 Expires 标头的另一台服务器上(例如 CDN)。这样做的好处有两个:

    expires 标头将鼓励浏览器和代理缓存这些静态文件 CDN 将从提供静态文件的服务器上卸载。 通过为您的静态内容使用另一个域名,浏览器的下载速度会更快。这是因为serving resources from four or five different hostnames increases parallelization of downloads。 如果 CDN 配置正确并使用 cookieless domain,那么您就没有不必要的 cookie 来回传输。

【讨论】:

【参考方案2】:

值得记住的是,即使没有 Cache-Control 或 Expires 标头,大多数浏览器也会缓存 JS 和 CSS 等内容。但是应该发生的是浏览器应该在每次需要时请求资源,但通常会得到“304 Unmodified”响应,然后浏览器使用缓存的项目。这仍然可能非常昂贵,因为它往返于服务器,但资源本身并未发送,因此传输的字节数是有限的。

IE 没有关于缓存的具体说明,默认情况下,它会使用自己的启发式方法来确定它是否应该重新请求其缓存的项目。尽管没有明确告知它可以缓存资源。它的启发式是基于资源的最后修改日期,它越旧,它现在改变的可能性就越小,这是它的典型推理。很毛茸茸的。

坦率地说,如果您想使网站表现出色,您需要控制此类缓存设置。如果您无权访问这些设置,则不必担心性能。只需通知赞助商,它可能表现不佳,因为他们没有促成一个可以让您实现这一目标的平台。

【讨论】:

【参考方案3】:

最好的办法是在 IIS 中为要缓存内容的文件夹设置 Expires 标头。这将告诉大多数现代浏览器和代理缓存此静态内容。在 IIS 6 中:

    右键单击要被浏览器缓存的文件夹(例如 CSS 或 JS)。 点击属性 转到 HTTP 标头选项卡 选中“启用内容过期” 设置较长的过期时间,例如“90 天后过期”

雅虎开发者博客talks about this technique.

【讨论】:

我无权访问 IIS。我想我正在寻找的是一种通过代码实现它的好方法。 如果 ASP.NET 提供 CSS 和 JS 文件,您可以自己在代码中执行相同的技术... Response.Cache.SetExpires(DateTime.Now.AddYears(1));跨度> ASP.NET 默认不会提供 !ASP.NET 资源,但他基本上需要再次访问 IIS【参考方案4】:

除非您将 IIS 配置为让 asp.net 控制 js/css/image 请求,否则默认情况下不会看到它们,因此您最好的计划(为了长期可维护性)是故意调整防火墙上的响应标头/ trafficmanager/server (更好,世界上大多数人在这一点上所做的)来版本你的文件在路径中,即:

不要在你的标记中写这个:

http://www.foo.com/cachingmakesmesad.css

使用这个:

http://www.foo.com/cachingmakesmesad.css?v1

..并在需要有效清除缓存时更改版本号。如果每次都是这样,那么您甚至可以附加一个 GUID 或日期戳,但我想不出我真的想在任何场合这样做。


我认为你的问题是反缓存但重新阅读它我发现我在那里浪费了一个很好的答案:P

长话短说,浏览器通常非常积极地支持缓存“简单”资源,因此您不必担心这一点,但如果您确实想对此做点什么,则必须访问防火墙/出于上述原因,trafficmanager/IIS(默认情况下不会给 ASP.NET 机会)。

但是... 你不可能绝对强制缓存,你也不应该这样做。什么是缓存什么不缓存是最终用户的决定,你所能做的就是强烈请求。

【讨论】:

【参考方案5】:

在 .net 中,您可以将 JavaScript、CSS 和图像设置为嵌入式资源。 .Net 将为您处理文件到期。 这种方法的缺点是您必须为每组更改进行新的构建(这可能是一个优点,具体取决于您的部署和工作流程)。

您也可以使用 ETag,但据我了解,在某些情况下,如果您混合使用 IIS and apache Webservers hosting your images(或者如果您打算在未来切换),它就不能很好地工作。

您可以确保文件日期较新,让服务器为您处理,但您必须确保服务器配置正确。

【讨论】:

【参考方案6】:

您可以通过在 web.config 中添加以下代码来缓存静态内容

 <system.webServer>
    <staticContent>
      <clientCache httpExpires="Tue, 12 Apr 2016 00:00:00 GMT" cacheControlMode="UseExpires" />
    </staticContent>
</system.webServer>

有关详细信息,请参阅clientCache documentation。

【讨论】:

以上是关于浏览器中的缓存的主要内容,如果未能解决你的问题,请参考以下文章

浏览器缓存

网页中的所有文件都会被浏览器缓存在本地吗?

防止浏览器中的 iframe 缓存

如何提取chrome浏览器缓存中的视频和音乐

如何快速清空微信浏览器中的缓存

浏览器后退按钮显示缓存中的页面?