HTTP协议中的缓存使用

HTML文档的<head>区域中加入描述文档的各种属性,这些Meta标签常常被用于标记文档不可以被缓存或者标记多长时间后过期。

当浏览器读取到此HTML页面是,会遵循这个标记,在客户端采取针对性的缓存措施。除了直接在HTML文档里进行标记外,还可以在Web服务器端进行标记。

在客户端,通过浏览器发出第一次请求,请求某一个URL时,根据HTTP协议的规定,浏览器会向服务器传送报头(HTTP Request Header),服务器端响应同事记录相关属性标记(HTTP Response Header),服务器端的返回状态会是200,格式类似如下:

HTTP/1.1 200 OK
Date: Mon, 16 May 2016 04:03:15 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: Tengine
Vary: Accept-Encoding
Cache-Control: must-revalidate, no-cache, private
Pragma: no-cache
Expires: Sun, 1 Jan 2000 01:00:00 GMT
Content-Encoding: gzip

客户端第二次请求此URL时,根据HTTP协议的规定,浏览器会向服务器传送报头(HTTP Request Header),服务器端响应请求,并查询到标记文件没有发生改动,服务端返回304,浏览器收到此状态码后,直接从本地缓存中读取:

HTTP/1.1 304 Not Modified
Date: Mon, 16 May 2016 04:05:08 GMT
Connection: keep-alive
Server: Tengine
Last-Modified: Tue, 05 Jan 2016 02:12:49 GMT
Etag: "568b26a1-2bca"
Expires: Wed, 15 Jun 2016 04:05:08 GMT
Cache-Control: max-age=2592000

其中Last-Modified、Expires和ETag是页面缓存标识。

1、Expires(过期时间)

        HTTP控制缓存的基本手段,其告诉缓存器相关副本在多长时间内是新鲜的。过了这个时间,缓存器就会向服务器发送请求,检查文档是否被修改。几乎所有缓存服务器都支持Expires属性。Expires头信息对于设置静态图片文件可缓存特别有用。因为这些图片修改很少,你可以给他们设置一个特别长的过期时间,这会是你的网站的用户相应变得非常快。

         过期时间头信息属性值只能是HTTP格式的日期时间,其他的都会被解析成当前时间“之前”,副本会过期。记住:HTTP的日期时间必须是格林威治时间(GMT),而不是本地时间。

例如:Expires:Fri,30 Oct 1998 14:19:41 GMT

2、Cache-Control

         可以让网站发布者全面控制内容,并定位过期时间的限制。

         有用的Cache-Control响应头信息包括:

  • max-age = [秒]:缓存过期时间,基于请求时间相对时间间隔。
  • s-maxage = [秒]:与上面类似。不同的是,它应用于共享(如代理服务器)缓存
  • public:标识认证内容也可以被缓存,一般来说,经过HTTP认证才能访问的内容,输出是自动不可以缓存的。
  • no-cache:强制此请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要认证的应用(可以和public结合)或者严格要求使用最新数据的应用。
  • no-store:强制缓存在任何情况下都不要保留任何副本。
  • must-revalidate:如果服务器端明确指出资源的过期时间或者保鲜时间,而且声明了资源的修改时间或者ETag之类的标识,那么就有一个问题了,在保鲜时间内,如果用到了该资源,是不是要到服务器确认一下资源是否最新的?如果服务器声明了must-revalidate,则每次使用该资源都需要确认资源新鲜性。
  • proxy-pevalidate:和上面类似,只对缓存代理服务器起作用。
  • Last-Modified:文档最后修改时间

在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个 Last-Modified的属性标记此文件在服务器端最后被修改的时间,格式类似这样:

Last-Modified: Tue, 05 Jan 2016 02:12:49 GMT

客户端第二次请求此URL时,根据HTTP协议的规定,浏览器会向服务器传送If-Modified-Since报头,询问该时间之后的文件是否有被修改过,例如:

If-Modified-Since: Tue, 05 Jan 2016 02:12:50 GMT

如果服务器端的资源没有变化,则自动返回HTTP304(Not Changed)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。


如果If-Modified-Since的时间比服务器当前时间(当前的请求时间request_time)还晚,会认为是个非法请求。


3、ETag

ETag是服务器生成的唯一标识符,每次副本的标签都会变化。HTTP协议规格说明定义ETag为“被请求变量的实体标记”。

服务器响应时给请求URL标记,并在HTTP响应头中将其传送到客户端,类似服务器端返回的格式,例如:

Etag: "568b26a2-88a5"

客户端的查询更新格式是这样的:

Etag: "568b26a2-88a5"
If-None-Match: "568b26a2-88a5"

如果ETag没有改变,返回状态304。在客户端发出请求后,HTTP Reponse Header中包含Etag: "568b26a2-88a5" 标识,等于告诉Client端,你拿到的这个资源又表示ID:"568b26a2-88a5"。下次需要发请求并索要统一个URI时,浏览器同时发出一个If-None-Match,此时报头信息包含上次访问得到的Etag: "568b26a2-88a5"标识。

If-None-Match: "568b26a2-88a5"

这样Client端等于缓存两份,服务器端就会比对两者的ETag。如果 If-None-Match  为False,不返回200,返回304(Not Modified)。

ETag和Last-Modified都能起到文档唯一性标识的作用


  1. 不经常改变的图片/页面启用缓存,使用Cache-Control:max-age属性设置一个较长的过期时间
  2. 定期更新的内容设置一个缓存服务器可识别的max-age属性或过期时间。
  3. 尽量避免使用POST,除非万不得已,POST模式的返回内容大部分缓存服务器不会保存,而如果发送内容通过URL或GET模式发送,那么发送的内容可以缓存下来供以后使用。
  4. 不要在URL中加入针对每个用户的识别信息:除非内容是针对不同用户的。

 

转载于:https://my.oschina.net/u/2672206/blog/675671

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值