`

浏览器缓存问题解决方案

阅读更多
浏览器缓存机制

浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires Cache-control等)。但是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下:

html code

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

上述代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。使用上很简单,但只有部分浏览器可以支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身。

下面我主要介绍HTTP协议定义的缓存机制。

Expires策略

ExpiresWeb服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。

下面是宝宝PK项目中,浏览器拉取jquery.js web服务器的响应头:

注:Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date: Mon,31 Dec 2001 04:25:57GMT

Web服务器告诉浏览器在2012-11-28 03:30:01这个时间点之前,可以使用缓存文件。发送请求的时间是2012-11-28 03:25:01,即缓存5分钟。

不过Expires HTTP 1.0的东西,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略。

Cache-control策略(重点关注

Cache-ControlExpires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control选择更多,设置更细致,如果同时设置的话,其优先级高于Expires

http协议头Cache-Control   

值可以是publicprivateno-cacheno- storeno-transformmust-revalidateproxy-revalidatemax-age

各个消息中的指令含义如下:

  1. Public指示响应可被任何缓存区缓存。
  2. Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
  3. no-cache指示请求或响应消息不能缓存
  4. no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
  5. max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
  6. min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
  7. max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

还是上面那个请求,web服务器返回的Cache-Control头的值为max-age=300,即5分钟(和上面的Expires时间一致,这个不是必须的)。

 Last-Modified/If-Modified-Since

Last-Modified/If-Modified-Since要配合Cache-Control使用。

l  Last-Modified:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。

l  If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的cache

Etag/If-None-Match

Etag/If-None-Match也要配合Cache-Control使用。

l  Etagweb服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器觉得)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的

l  If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-MatchEtag的值)web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定返回200304

既生Last-Modified何生Etag

你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag(实体标识)呢?HTTP1.1Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

l  Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间

l  如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存

l  有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形

Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-ModifiedETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304

用户行为与缓存

浏览器缓存行为还有用户的行为有关!!!

用户操作

Expires/Cache-Control

Last-Modified/Etag

地址栏回车

有效

有效

页面链接跳转

有效

有效

新开窗口

有效

有效

前进、后退

有效

有效

F5刷新

无效

有效

Ctrl+F5刷新

无效

无效

 

 

分享到:
评论

相关推荐

    js、css、img等浏览器缓存问题的2种解决方案.docx

    浏览器缓存问题的2种解决方案 在 Web 开发中,浏览器缓存是非常重要的一部分,它可以提高网站的加载速度和执行效率,但同时也带来了许多问题,例如当服务端修改了 js、css 等文件时,客户端无法更新,这就需要我们...

    js浏览器缓存.doc

    在进行Web开发的过程中,开发者可能会遇到一个较为隐蔽但十分常见的问题——浏览器缓存导致的重复请求失效现象。特别是使用某些JavaScript库(如Prototype.js)时,如果多次发出相同的GET请求,可能会发现除了首次...

    浏览器缓存问题5个.docx

    ### 浏览器缓存问题解析 #### 一、浏览器缓存未及时更新内容的问题 **问题描述**:用户在访问网站时,浏览器未能从服务器获取最新的资源,而是显示缓存中的旧版本内容。 **原因分析**:此问题通常由HTTP缓存策略...

    Chrome浏览器缓存查看导出工具(支持最新版)

    5. **全站下载**:对于需要下载整个网站内容的用户,这个工具可以作为一种全站下载的解决方案,一次性导出所有相关的缓存文件,避免逐个文件手动下载的繁琐操作。 总的来说,"Chrome浏览器缓存查看导出工具"是一个...

    nginx静态文件缓存的解决方案1

    【Nginx 静态文件缓存解决方案】 Nginx 是一款高性能的 HTTP 和反向代理服务器,常用于处理静态资源,以减轻后端服务器的压力。为了进一步提高静态资源的访问效率,我们可以利用 Nginx 的缓存功能。下面详细介绍...

    浏览器缓存视频文件

    总的来说,理解和利用浏览器缓存可以为那些希望保存在线视频但无法直接下载的用户提供一种解决方案。通过使用工具如VideoCacheView,可以便捷地访问和管理这些缓存的视频文件,从而实现无阻碍的离线观看。然而,这种...

    Ajax中浏览器的缓存问题解决方法

    总而言之,针对Ajax中浏览器缓存问题,我们介绍了几种解决方案,包括修改HTTP请求头部信息、在URL中添加随机数或时间戳以及通过jQuery配置禁用缓存。通过这些方法,我们能够确保每次Ajax请求都能从服务器获取到最新...

    一键删除IE浏览器缓存脚本

    标题中的“一键删除IE浏览器缓存脚本”指的是一个用于快速清理Internet Explorer(简称IE)浏览器缓存的批处理文件。这种脚本通常由程序员或系统管理员编写,以自动化执行清理任务,避免用户手动操作的繁琐。批处理...

    当用户退出点击浏览器后退仍可回到原来页面的解决方案

    解决方案1:禁用缓存,前一次使用的方法,在电脑上各浏览器都没问题,但在ipad、安卓手机上仍有问题 解决方案2:禁用浏览器后退键 [removed] window.history.forward(1); 结果和方案一一样的结果,pad上没效果 ...

    js、css、img等浏览器缓存问题的2种解决方案

    总的来说,解决浏览器缓存问题的关键在于平衡缓存利用和资源更新的需求。生成随机数字虽然简单,但可能导致不必要的网络开销;版本号控制更为推荐,既保持了缓存效率,又能确保更新。而更复杂的自动化构建方案则适合...

    浏览器被劫持解决方案.rar

    3. **清理浏览器缓存和Cookie**:浏览器缓存可能存储了导致问题的恶意文件。清理缓存和Cookie可以帮助消除潜在的恶意影响。 4. **运行安全扫描**:使用杀毒软件或安全工具(如压缩包内的"WMITools.exe")进行全面...

    ..........

    ChromeCache.sln和ChromeCache.suo是Visual Studio的项目解决方案文件和用户选项文件,它们与Chrome的缓存机制直接关联。ChromeCache.sln文件包含了项目的配置信息,而ChromeCache.suo则记录了用户的个性化设置,如...

    HTML,JSP页面缓存的解决方案

    ### HTML与JSP页面缓存解决方案 在Web开发过程中,页面缓存问题一直是开发者们关注的重点之一。合理的页面缓存管理不仅可以提升用户体验,还可以减轻服务器压力。然而,在某些情况下,如模态窗口中的POSTBACK操作时...

    浏览器缓存

    在Java开发中,浏览器缓存是一个常见的问题,特别是在动态网页应用中,如JSP。当用户更新了页面上的内容,比如修改了客服人员的头像,但刷新页面后,旧的图像可能仍然显示,这就是浏览器缓存导致的现象。浏览器缓存...

    Flex客户端IE浏览器缓存问题

    在IT行业中,尤其是在Web开发领域,Flex是一种广泛使用的富互联网应用程序(RIA)开发框架,它...在给定的“FlexTest”压缩包中,可能包含了用于测试上述解决方案的示例代码或文档,帮助开发者更好地理解和解决问题。

    如何解决缓存问题及如何设置缓存

    缓存问题解决方案和设置缓存方法 缓存是Web开发中一个常见的问题,它可以极大地影响网站的性能和用户体验。因此,解决缓存问题和设置缓存是非常重要的。在这篇文章中,我们将讨论如何解决缓存问题和设置缓存。 ...

    安卓图片加载缓存相关-图片浏览器缓存viewpager.rar

    "安卓图片加载缓存相关-图片浏览器缓存viewpager.rar"这个压缩包文件包含了针对这个问题的一些解决方案。`ViewPager`组件在安卓中常用于实现滑动切换页面的效果,比如在图片浏览场景下,用户可以左右滑动查看不同的...

    在开发AJAX过程中遇到的问题及解决方案

    然而,在开发过程中也会遇到各种各样的问题,本文将重点讨论其中的一个典型问题:浏览器缓存导致的数据不更新,并提供相应的解决方案。 #### 二、问题描述:浏览器缓存问题 在使用AJAX进行异步数据请求时,经常会...

Global site tag (gtag.js) - Google Analytics