标签:编写 限制 基于 date max-age 工作 mon 运营商 eva
缓存是位于服务器和客户端的中间单元,主要根据用户代理发送过来的请求,向服务器请求相关内容后提供给用户,并保存内容副本,例如 HTML 页面、图片、文本文件或者流媒体文件。然后,当下一个针对相同 URL 的请求到来时,缓存直接使用副本来响应 HTTP 请求,而不需要向源服务器再次发送请求。
HTML 文件的编写者会在文档的<HEAD>
区域中加入描述文档的各种属性,这些 META 标签常常被用于标记文档不可以被缓存或者标记多长时间后过期。META 标签使用很简单,但是效率不高,因为能够读懂这个标记的浏览器只有少许几种,同时由于中间缓存几乎完全不解析文档中的 HTML 内容,所以也没有什么中间缓存(代理缓存和网关缓存)能读懂这个规则。如果要通过 META 标签来控制页面不缓存,一般情况下会在 Web 页面的<HEAD>
区域中增加 "Pragma: no-cache" 的 META 标记。
通常情况下,主要通过 HTTP 头信息来指示缓存和控制内容是否缓存。这些控制信息在 HTML 代码中是看不见的,一般由 Web 服务器自动生成,并在 HTTP 消息中进行标识。一个典型的 HTTP 1.1 协议响应消息的头信息看上去如下:
HTTP/1.1 200 OK
Data: Mon, 18 Jul 2011 22:14:49 GMT
Server: Apache
Cache-Control: max-age=3600, must-revalidate
Expires: Mon, 18 Jul 2011 23:14:49 GMT
Last-Modified: Sun, 5 Jun 2011 16:38:21 GMT
ETag: "5e36-767-576df70c"
Content-Length: 1040
(空行)
HTML 代码
该代码中包含了 Expires 头,指示Mon, 18 Jul 2011 23:14:49 GMT
为过期时间。Expires 方式是 HTTP 控制缓存的基本手段,这个属性告诉缓存相关内容在多长时间内是新鲜的。过了这个时间,如果客户端向缓存请求这个内容,缓存就会向源服务器发送请求,检查文档是否已经发生了变化。大部分 Web 服务器设置 Expires 方式有多种,最常用的是设置成一个绝对的时间值,比如将内容最后被修改的时间点加上一个特定的时间段(比如一个小时)所得到的时间值。
在 HTTP 1.1 中对缓存提出了验证的概念,验证的目的就是检验缓存内容是否可用。当中间缓存存在一个过期的缓存内容,并且对应的访问请求到达时,缓存应该首先向源服务器或者其他保存有未过期的缓存服务器请求验证来确定本地的缓存内容是否可用。这个过程就是一个缓存消息的验证过程。
HTTP 1.1 把这种验证后再决定是否返回消息内容的方式叫 "有条件" 的请求返回方法,这样可以避免从源服务器或其他缓存服务器获取整个内容的消息,从而减少网络流量。当源服务器生成了一个完整的响应消息时,它会附带一个验证消息,中间缓存在缓存内容时可以保存这个验证信息,当缓存内容过期以后,中间缓存可以使用它生成一个 "有条件" 的请求来向源服务器请求验证。而源服务器或者在源服务器通信的路径上的其他缓存服务器(如果保存有未过期的内容)在收到这样的请求以后就可以将请求中包含的验证信息与自己本地的验证信息进行比较。如果两个验证信息相等,那么返回一个带有特定状态码(如 304 Not Modified,表示内容未修改过)且消息主体内容为空的响应消息,在这种情况下就减少了网络流量;如果两个验证信息不相等就需要传输一个包含新内容的完整响应消息。
指定过期时间和验证是 HTTP 1.1 的基本缓存机制,也是缓存的隐含指令。但是在某些情况下,服务器或客户端可能需要给 HTTP 缓存提出显示的指令。因此,HTTP 1.1 使用 Cache-Control 响应头信息来让网站的发布者可以更安全的控制他们的内容,并对过期时间进行限制。
有用的 Cache-Control 响应头信息包括如下几项:
HTTP 还有一种缓存控制机制,为使用 Pragma HTTP 头信息的方式。Pragma 属于通用头,用来包含特定的执行指令,这些指令可以适用于客户端、代理、网关、源服务器中的任何接收者,但是 HTTP 协议中认为 Pragma 指令规定的行为是可选的。
当 "Pragma: no-cache" 出现在请求消息中时,即使缓存设备中缓存了此请求响应所需的内容,也会直接将此请求转发到源服务器上。虽然在 HTTP 1.1 中提到了通过 Pragma 控制缓存的方法,但这主要是为了向 HTTP 1.0 兼容,因为支持 HTTP 1.0 的缓存主要还是通过这种方法来控制内容缓存的。HTTP 1.1 中主要还是通过 Cache-Control 头信息来控制缓存,所以协议要求当一个 HTTP 1.1 的请求从客户端发出时,既应该包含 Pragma 指令,也应该包含 Cache-Control 的控制指令,这样,请求从客户端发给源服务器的过程中,分别支持 HTTP 1.1 和 HTTP 1.0 的缓存设备都可以读懂指令的信息。如果发送指令的客户端本身只支持 HTTP 1.0,那么支持 HTTP 1.1 的中间缓存在收到请求消息后必须以 Pragma 中的指令来控制缓存。
注:在 HTTP 规范中 Pragme 属性没有任何关于响应信息头 Pragma 属性的说明,它仅出现在请求头信息中,即头信息由浏览器发送给服务器,但实际上只有少数几种缓存服务器会遵循请求消息中的这个头信息。因此,在很多情况下,使用 Pragma 属性不一定管用。
标签:编写 限制 基于 date max-age 工作 mon 运营商 eva
原文地址:https://www.cnblogs.com/jimodetiantang/p/9158694.html