白皮书

Web 浏览器的缓存行为

Updated February 05, 2014
  • Share via AddThis

当用户访问 Web 页面时,网页的内容可以存储在浏览器的缓存中,这样就不需要重新请求和重新下载。有效地利用浏览器缓存可以缩短最终用户的响应时间,减少带宽的占用。

浏览器的缓存能力由以下因素所决定:

  • 从源 Web 服务器返回的响应标头。如果标头表明内容不应该被缓存,便不会执行缓存操作。
  • 响应中必须存在验证程序,如 ETag 或 Last-Modified 标头。

如果一个项目被视为可以缓存,则浏览器将在重复访问时从缓存中检索该项目(如果该项目被视为“fresh”)。Fresh 度由以下因素所决定:

  • 在 fresh 期内的有效到期日。
  • 浏览器的设置如下所述。

如果项目已经不 fresh了或者没有有效的到期日,浏览器会要求源 Web 服务器验证内容,以确认其具备可提供服务的副本。然后,Web 服务器会返回 304,让浏览器了解本地缓存的副本仍然可以使用。如果内容发生了变化,Web 服务器会返回 200 响应代码,并提供新的版本。

浏览器缓存的使用方式主要取决于三个方面:

  • 浏览器设置
  • 网站(HTML 代码和 HTTP 标头)
  • 用户加载页面的方式

浏览器设置

用户可以配置自己希望存储哪些缓存内容以及如何从其本地缓存中传递缓存内容,或者可以自行决定是否想要缓存全部内容。Internet Explorer 和 Firefox 对其会有略微不同的分类方式。

每次访问/查看 Web 页面

当用户返回到以前访问过的页面时,浏览器会对源 Web 服务器进行检查,以确定该页面自上次浏览后是否有变化。

每次我启动浏览器/每一次会话

如果在同一浏览器会话中重新访问一个页面,则内容将由缓存进行传送。浏览器关闭后再打开时,将发送请求确认内容是否有变化。如果在同一浏览器会话中访问一个页面,将使用缓存文件,而不是从源 Web 服务器下载内容。

自动/当页面过期时

当浏览器关闭,然后在重复访问时重新打开,它将使用缓存内容的生存期设置。如果在单个浏览器会话期间访问同一页面,则将使用缓存文件。这是 Internet Explorer 和 Firefox 的默认设置。

从不

浏览器不会向源 Web 服务器检查是否有更新的内容。

对于 IE 和 Firefox,这些设置可以通过以下方式进行配置:

Internet Explorer

  • 选择工具
  • 选择 Internet 选项
  • IE 7:从浏览历史记录下的常规选项卡,选择“设置”。
  • 在 IE 5 或 6 的 Internet 临时文件下,单击设置

Firefox

  • 在 Firefox 浏览器中输入 about:config
  • 双击 browser.cache.check_doc_frequency 设置
  • 在对话框中输入所需的整数值
  • 0 = 每一次会话
  • 1 = 每次我查看该页面时
  • 3 = 当页面过期时(默认)
  • 2 = 从不

除了配置常规缓存设置外,还有一些其他设置可以控制 SSL 内容是否可以得到缓存。当启用该选项时,任何 SSL 内容都不会被存储到磁盘上,这包括静态图像,还包括强迫浏览器在每次访问页面时请求内容。Internet Explorer 默认禁用该选项,而 Firefox 则默认启用该选项。

若要启用/禁用 SSL 内容的缓存:

Internet Explorer

  • 选择工具
  • 选择 Internet 选项
  • 选择高级
  • 安全部分下
    • 选择“不将已加密的页面存盘”选项,不缓存 SSL 内容
    • 取消选择“不将已加密的页面存盘”选项,以缓存 SSL 内容

Firefox

  • 在 Firefox 浏览器中输入 about:config
  • 双击 browser.cache.disk_cache_ssl,更改设置
    • “True” 表示 SSL 内容将被缓存
    • “False” 表示不会缓存 SSL 内容

网站

为了让内容从缓存中提供,URL 必须与缓存中的内容完全匹配。一些 Web 开发人员会在查询字符串的一部分添加随机数,以确保内容不被缓存,并且始终保持“ fresh ”。当这些随机查询字符串被添加到 URL 中时,浏览器将无法识别该内容与已经在缓存中的项目是否相同,并将对该元素发出新的 GET 请求。

在大多数情况下,内容的缓存行为是由 Cache-Control 和 Expires HTTP 标头所控制。Cache-Control 标头指定了内容是否可以被缓存以及缓存的时间。相关值可以包括:

  • no-cache:不要缓存此内容
  • private:可以被浏览器缓存,但不能是共享缓存/公共缓存
  • max-age:以秒为单位;指定内容被视为 fresh 的最长时间

只包含 Expires 标头,而没有 Cache-Control 标头,表示内容可以被浏览器缓存,也可以是公共/共享缓存,并在指定的日期和时间之后被视为过时,具体信息如下所示:

(Status-Line) HTTP/1.1 200 OK Content-Length 4722 Content-Type image/gif Date Fri, 31 Aug 2007 10:20:29 GMT Expires Sun, 17 Jan 2038 19:14:07 GMT Last-Modified Wed, 07 Jun 2006 23:55:38 GMT URL in cache? Yes Expires 19:14:07 Sun, 17 Jan 2038 GMT Last Modification 23:55:38 Wed, 07 Jun 2006 GMT Last Cache Update 10:20:32 Friday, August 31, 2007 GMT Last Access 10:20:31 Friday, August 31, 2007 GMT ETag Hit Count 1

如果不存在 Cache-Control 或 Expires 标头,浏览器将缓存没有过期日期的内容,如下图所示:

Headers: (Status-Line) HTTP/1.1 200 OK Accept-Ranges bytes Connection Keep-Alive Content-Length 221 Content-Type Image/gif Date Fri, 31 Aug 2007 10:27:06 GMT Last-Modified Fri, 02 Jun 2006 09:46:32 GMT URL in cache? Yes Expires (Not set) Last Modification 09:46:32 Friday, June 02, 2006 GMT Last Cache Update 10:26:32 Friday, August 31, 2007 GMT Last Access 10:26:31 Friday, August 31, 2007 GMT ETag Hit Count 1

一些 Web 开发人员选择使用 META 标记来控制内容的缓存方式,而不是在 HTTP 标头中设置缓存参数。使用 HTTP 标头是控制缓存行为的首选方式。

控制浏览器和代理缓存

有四个值可以用于内容变量:

  • Private:只能在浏览器等私有缓存中进行缓存
  • Public:可在共享缓存或私有缓存中缓存
  • No-Cache:内容不能被缓存
  • No-Store:内容可以被缓存,但不能被归档 Expires 标记应与 Cache-Control 标记一起使用,以指定内容可以存储的时间。

阻止浏览器缓存

当收到时,浏览器不会将内容缓存在本地;这实际上与发送 Cache-Control=No-Cache 标头无异。

刷新内容或将用户重定向到其他页面


刷新元素可以用来告知浏览器将用户重定向到其他页面,或者在一定时间后刷新页面。刷新标记的作用与在浏览器中点击刷新按钮的方式相同。即使内容有一个有效的到期日,浏览器也会要求验证其自源服务器没有发生变化。这实质上违背了设置内容有效期的目的。

如果在 META 标记中指定了一个 URL,则意味着浏览器在时间过后会重定向到指定的 URL。不建议通过 META 标记而非 HTTP-Response 标头来重定向用户,因为用户可以在浏览器安全设置中关闭 META 刷新。

用户加载页面的方式

重复访问时,从缓存中提取内容的方式会受请求发出方式的影响。

浏览多个页面或点击后退按钮

在同一浏览器会话中,网站的所有内容将从本地浏览器缓存中提供。如果用户单击一个应用的多个页面,并且在每个页面上都发现了相同的图形和元素,则请求将不会被发送到源 Web 服务器。相反,它将从本地缓存中提供服务。如果用户在该会话中再次访问一个页面,所有的内容(包括 HTML)将从本地缓存中检索(取决于浏览器的设置),具体信息请参照下图。一旦浏览器关闭,会话缓存就会予以清除。在下一个会话中,唯一使用的缓存是磁盘缓存。

刷新

用户也可能会点击页面上的刷新来检查新的内容,如更新的体育比分或新闻文章。点击刷新会将一个“If-None-Match”标头发送到源 Web 服务器,用于处理当前磁盘缓存中的所有内容(与缓存内容的到期日无关)。这将导致当前在浏览器缓存中的每个可重复使用的项目得到 304 响应代码,如下图所示。

CTRL + 刷新或 CTRL + F5

点击 CTRL 和刷新(仅在 Internet Explorer 中)或 CTRL 和 F5(Internet Explorer 和 Firefox)将在请求中插入一个“Cache-Control=no-cache”标头,使所有的内容直接由源服务器提供,而非来自本地浏览器缓存中的内容。所有的对象都会包含一个 200 的响应代码,表示所有的内容都是直接从服务器提供,如下图所示。

新的浏览器会话

如果启动新的浏览器会话且用户返回经常访问的网站,将使用本地浏览器缓存(根据浏览器设置)。如果缓存的内容存在有效的到期日,将直接从缓存中传送,而不会向源 Web 服务器发出请求。如果内容没有有效的到期日,则浏览器将在请求中插入“If-modified-since”或“If-none-match”标头。如果内容没有变化,则服务器将返回 304,并从缓存中检索内容。另一方面,如果内容发生了变化,服务器将以 200 来回应,并将内容传送给用户。

推荐设置

对于 BIG-IP® WebAccelerator™ 的老用户,只要他们使用以下推荐的设置,就可以受益匪浅。通过使用这些设置,用户将从 WebAccelerator 的 Intelligent Browser Referencing 功能中得到诸多益处。

浏览器设置

  • 自动/当页面过期时
  • SSL 内容应该被缓存。

网站

如果静态内容包含随机的查询参数以防止缓存,可以使用 iRule 来删除这些随机参数并启用缓存。

如前所述,使用 HTTP 标头而不是 META 标记是控制应用缓存行为的首选方式。META 标记的使用将有可能抵消加速带给最终用户的益处。META 标记可以通过使用 iRules 或自定义重写脚本来消除。随着 META 标记的消除,最终用户将会体验到 Intelligent Browser Referencing 的好处。

页面加载

要查看应用在加速和不加速情况下的差异,必须启动一个新的浏览器会话;而重复访问时加载页面的其他三种方式在加速或不加速情况下都不会有任何差异。

结论

消除浏览器在重复访问时下载内容的需要,可以大大提高 Web 应用的性能。有很多因素会影响在重复访问时是否能(或是否会)从本地浏览器缓存中检索内容,包括浏览器设置、网站和用户的行为。BIG-IP WebAccelerator 可以在无需改变应用的情况下提高用户缓存的利用率。