这篇文章紧接上篇文章,讨论http报文header中的各种字段的含义。
HTTP首部字段按照实际用途被分为通用首部字段(General Header Fields)、请求首部字段(Request Header Fields)、响应首部字段(Response Header Fields)和实体首部字段(Entity Header Fields)。
按照首部字段在有代理时的不同行为,首部字段又可以分为端到端首部(End-to-end Header)和逐跳首部(Hop-by-hop Header)。逐跳首部只对单次转发有效,经过缓存或代理后不再转发,HTTP/1.1和之后的版本中,要使用逐跳首部时需提供Connection首部字段。端到端首部则会一直发送给最终接收目标。
通用首部字段
通用信息性首部字段
-
Connection,两个作用:
1、控制不再转发给代理的首部字段(即逐跳首部)。应用程序会删除报文中所有在Connection首部中出现过的首部,如下示例:# 客户端请求首部 GET / HTTP/1.1 Upgrade: HTTP/1.1 Connection: Upgrade # 经过代理服务器后发送给Web服务器的首部 GET / HTTP/1.1
2、管理持久连接
Connection: close HTTP/1.1默认都是持久连接,使用close后会明确断开连接
Connection: keep-alive HTTP/1.1之前的版本默认都是非持久连接,使用keep-alive可以维持持久连接
- Date 创建HTTP报文的时间和日期
- Trailer 说明在报文主体后记录了哪些首部字段
- Transfer-Encoding 传输报文主体时采用的编码方式
- Upgrade 用于检测HTTP协议及其他协议是否可使用更高的版本进行通信
通用缓存首部字段
1、Cache-Control 管理缓存信息,是HTTP/1.1引入的一个复杂首部。
a、请求指令:
- no-cache 客户端不接收缓存过的响应
- no-store 不缓存响应或请求的任何内容
- max-age = [秒] 告诉缓存服务器,如果缓存时间没超过指定时间,就返回缓存
- max-stale( = [秒]) 即使缓存过期,只要小于该值,也照常接收
- min-fresh = [秒]
- no-transform 缓存不能改变实体主体的媒体类型
- only-if-cached 只有缓存服务器有缓存指定资源时才返回,否则,返回504 Gateway Timeout
- cache-extension
Pragma 当"no-cache"出现在请求消息中时,应用程序应当向原始服务器推送此请求,即使它已 经在上次请求时缓存了一份拷贝。这样将保证客户端能接收到最权威的回应。它也用来在客户端发现其缓存中拷贝不可用或过期时,对拷贝进行强制刷新。
max-age>0 时 直接从游览器缓存中提取
max-age<=0 时 向server 发送http请求,确认该资源是否有修改。有的话返回200,无的话返回304。
b、响应指令:
- public 其他用户也可以使用该缓存
- private 只有特定用户能使用该缓存
- no-cache 缓存服务器可以缓存,但是每次提供给客户端前都必须与服务器确认有效期
- no-store 不缓存响应或请求的任何内容
- no-transform 缓存不能改变实体主体的媒体类型
- must-revalidate 返回缓存时,必须再次验证。会使max-stale无效
- proxy-revalidate 告知缓存服务器,客户端带有该指令时必须验证缓存有效性
- max-age = [秒] 在指定时间内不需要像源服务器确认。HTTP/1.1优先处理max-age,HTTP/1.0优先处理Expiress-maxage = [秒] 与max-age功能相同,但s-maxage只适用于供多位用户使用的公共缓存服务器
- cache-extension
请求首部字段
请求信息性首部字段
- From 请求来自何方,格式是客户端用户的有效电子邮件地址
- Host 服务器的主机名和端口号
- Referer 这次请求的URL是从哪里获得的
- User-Agent 客户端的浏览器或代理信息
Accept首部字段
- Accept 客户端通过该首部字段告诉服务器自己可以接收哪些媒体类型,如text/html、image/、/*。此外,还有可以权重系数(q值)来表示媒体类型的优先级。
- Accept-Charset 客户端可以接收哪些字符集,也可以有q值
-
Accept-Encoding 客户端支持的内容编码及内容编码的优先级顺序。
gzip 由文件压缩程序gzip生成的编码格式
compress 由UNIX文件压缩程序compress生成的编码格式
deflate 组合使用zlib格式及由deflate压缩算法生成的编码格
identify 不执行压缩或不会变化的默认编码格式
- Accept-Language 客户端能够处理的自然语言集(中文、英文等)
- TE 客户端能够处理的传输编码,还可以指定伴随trailer字段的分块传输编码方式
条件请求首部字段
- Expect 客户端通过该首部字段告知服务器它们需求某种行为,现在该首部与响应码100 Continue紧密相关。如果服务器无法理解该首部的值,就应该返回417 Expectation Failed
- If-Match 服务器会比对该字段的值和资源的ETag值,仅当两者一致时,才会执行请求,否则,返回412 Precondition Failed。该字段值为*时,会忽略ETag值
- If-Modified-Since 该字段值应该是一个日期,如果服务器上资源的更新时间较该字段值新则处理该请求,否则,返回304 Not Modified
- If-None-Match 与If-Match相反,该字段的值与请求资源的ETag不一致时,处理该请求
- If-Range 该字段的值(ETag或时间)与资源的ETag或时间一致时,作为范围请求处理(参加首部字段Range)。否则,返回全体资源
- If-Unmodified-Since 与If-Modified-Since相反,服务器上资源的更新时间早于该字段值时处理请求,否则,返回412 Precondition Failed
安全请求首部字段
- Authorization 向服务器回应自己的身份验证信息。客户端收到来自服务器的401 Authentication Required响应后,要在其请求中包含这个首部
- Cookie HTTP/1.1中没有定义,用于客户端识别和跟踪的扩展首部
代理请求首部字段
- Max-Forwards 只能和TRACE方法一起使用,指定经过代理或其他中间节点的最大数目。每个收到带此首部的TRACE请求的应用程序,在请求转发之前都要将这个值减1;如果应用程序收到请求时,该首部值为0,则立即回应一条200 OK响应
- Proxy-Authorization 与Authorization类似,用于客户端与代理服务器之间的身份验证
响应首部字段
响应信息性首部字段
- Age 响应已经产生了多长时间。HTTP/1.1规定缓存服务器在创建响应时必须包含Age首部
- Location 客户端应重定向到指定URI,基本配合3**响应出现
- Retry-After 告诉客户端多久之后再次发送请求。主要配合503 Service Unavailable使用,或与3**响应一起使用
- Server HTTP服务器的应用程序信息
- Warning
协商首部字段
- Accept-Ranges 服务器是否能处理范围请求,bytes表示能,none表示不能
- Vary
通知客户端,服务器端的协商中会使用哪些来自客户端请求的首部
缓存控制:对某次请求,响应报文的Vary中会指定一些首部名称,客户端后续请求相同资源时,这些首部与缓存的那次请求完全一致时才会返回缓存的资源
安全响应首部字段
- Proxy-Authorizate 与WWW-Authenticate类似,用于代理与客户端之间的认证,407 Proxy Authentication Required响应必须包含该首部
- Set-Cookie 非HTTP/1.1标准首部
- WWW-Authenticate 告诉客户端访问所请求资源的认证方案,401 Unauthorized响应中肯定有该首部
实体首部字段
实体首部字段是在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息
实体信息性首部字段
- Allow 通知客户端可以对特定资源使用那些HTTP方法。405 Method Not Allowed响应中必须包含该首部
内容首部字段
- Content-Encoding 告诉客户端实体的主体部分选用的内容编码方式。具体方式参见Accept-Encoding
- Content-Language 告诉客户端实体主体使用的自然语言(中文、英文等)
- Content-Length 表明实体主体部分的大小(单位:字节)。对实体主体进行内容编码传输时,不能再使用该首部字段
- Content-Location 报文主体部分相对应的URI
- Content-MD5 一串由MD5算法生成的值。对于检查在传输过程中数据是否被无意的修改非常有用,但不能用于安全目的,因为报文如果被有意的修改,该字段的值也可以计算后作相应修改
- Content-Range 针对范围请求,提供了请求实体在原始实体内的位置(范围),还给出了整个实体的长度
- Content-Type 响应报文中对象的媒体类型
实体缓存首部字段
- ETag 实体标记,就是一种标识资源的方式
- Expires 资源失效日期,当Cache-Control有指定max-age指令时,会优先处理max-age
- Last-Modified 资源最终修改时间
http请求报文
Cache 头域
If-Modified-Since
作用: 把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。
If-None-Match
作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能
Pragma
作用: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样
Pargma只有一个用法, 例如: Pragma: no-cache
注意: 在HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control