第六章:HTTP首部

第六章:HTTP首部

1.HTTP首部字段

  HTTP首部字段是构成HTTP报文的要素之一,在客户端与服务器之间以HTTP协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。HTTP首部字段是由首部字段名和字段值构成的,中间用“:”分隔。例如:  

Content-Type: text/html

  首部字段名为Content-Type,字符串text/html是字段值。

  HTTP首部字段根据实际用途被分为4种类型:

  • 通用首部字段:请求报文和响应报文两方都会使用的首部。

  

  • 请求首部字段:从客户端向服务器端发送请求报文时使用的首部,补充了请求的附加内容、客户端信息、相应内容相关优先级等信息。

  

   

  • 响应首部字段:从服务器端向客户端返回报文时使用的首部,补充了响应的附加内容,也会要求客户端附加额外的内容信息。

  

  • 实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息。

  

2.通用首部字段

2.1 Cache-Control

  通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。指令的参数可选,多个指令之间用“,”分隔,首部字段Cache-Control的指令可以用于请求及响应时。例如:

  Cache-Control: private, max-age=0, no-cache

  缓存请求指令:

  

   缓存响应指令:

  

   1.表示是否能缓存的指令

  (1)public指令,当指定使用public指令时,则表明其他用户也可以利用缓存。

  (2)private指令,响应只以特定用户作为对象。

  

  (3)no-cache指令

  

  使用no-cache指令的目的是为了防止从缓存中返回过期的资源。

  • 客户端发送的请求中如果包含no-cache指令,则表示客户端将不会接收缓存过的响应,于是,中间的缓存服务器必须把客户端请求转发给源服务器;
  • 如果服务器返回的响应中包含no-cache指令,那么缓存服务器不能对资源进行缓存,源服务器以后也将不能对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应进行缓存操作。

  2.控制可执行缓存的对象的指令

  (1)no-store指令,暗示请求(和对应的响应)或响应中包含机密信息,该指令规定不能在本地存储请求或响应的任一部分。no-cache事实上是表示不缓存过期的资源,缓存会向源服务器进行有效确认后处理资源,而no-store才是真正的不进行缓存。

  3.指定缓存期限和认证的指令

  (1)s-maxage指令,该指令只适用于供多位用户使用的公共缓存服务器。

  (2)max-age指令

  

  • 当客户端发送的请求中包含该指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源,当指定max-age值为0时,那么缓存服务器通常需要将请求转发给源服务器。
  • 当服务器返回的响应中包含给指令时,缓存服务器将不对资源的有效性再做确认,而max-age数值代表资源保存为缓存的最长时间。

  (3)min-fresh指令,要求缓存服务器返回至少还未过指定时间的缓存资源。比如,当指定min-fresh为60秒后,过了60秒的资源都无法作为响应进行返回了。

  (4)max-stale指令,如果指令未指定参数值,那么无论过多久,客户端都会接收响应;如果指令中指定了具体数值,那么即使过期,只要仍处于max-stale指定的时间内,仍然会被客户端接收。

  (5)only-if-cached指令,表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回,也就是说,该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。

  (6)must-revalidate指令,使用该指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。

  (7)proxy-revalidate指令,要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。

  (8)no-transform指令,规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型,这样可以防止缓存或代理压缩图片等类似操作。

2.2 Connection

  Connection首部字段具备两个作用:

  (1)控制不再转发代理的首部字段;

  

   在客户端发送请求和服务器返回响应内,使用该首部字段,可以控制不再转发给代理的首部字段。

  (2)管理持久连接。

  默认连接都是持久连接,客户端会在持久连接上连续发送请求,当服务器端想明确断开连接时,则指定Connection首部字段的值为Close。

  

 2.3 Date

  首部字段Date表明创建HTTP报文的日期和时间。例如:

  Date:Tue, 03 Jul 2012 04:40:59 GMT

2.4 Pragma

  Pragma是HTTP/1.1之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义。该首部字段属于通用首部字段,但是只用在客户端发送的请求中,客户端会要求所有的中间服务器不返回缓存的资源。

  

  为了整体掌握全部中间服务器使用的HTTP协议版本,发送的请求中会同时包含两个首部字段:

  

 2.5 Trailer

  

  该首部字段会事先说明在报文主体后记录了哪些首部字段,该首部字段可应用于在HTTP/1.1版本分块传输编码时。

2.6 Transfer-Encoding

  规定了传输报文主体时采用的编码方式。HTTP/1.1的传输编码方式仅对分块传输编码有效。

  

 2.7 Upgrade

  用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。Upgrade首部字段产生作用的Upgrade对象仅限于客户端与邻接服务器之间,因此使用该字段时,还需要额外指定Connection: Upgrade。

   

 2.8 Via

  使用Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径。在下面的例子中,在经过代理服务器A时,Via首部附加了“1.0 gw.hackr.jp (Squid/3.1)”这样的字符串值,行头的1.0是指接收请求的服务器上英勇的HTTP协议版本,接下来经过代理服务器B也是这样,在Via首部附加服务器信息,也可增加1个新的Via首部写入服务器信息。

  

2.9 Warning

  该首部通常会告知用户一些与缓存相关的问题的警告。

  

 3.请求首部字段

  请求首部字段是从客户端往服务器端发送请求报文所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。

3.1 Accept

  Accept首部字段用于通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。

  

  媒体类型:

  

 4.2 Accept-Charset

   该字段用于内容协商机制的服务器驱动协商。通知服务用户代理支持的字符集及字符集的相对优先顺序。

  

4.3 Accept-Encoding

   告知服务器用户代理支持的内容编码以及内容编码的优先级顺序,可以一次性指定多种内容编码。

  

  

 4.4 Accept-Language

  告知服务器用户代理能够处理的自然语言集,以及自然语言集的相对优先级,按照权重值q来表示该相对优先级。下面的例子中,客户端在有中文版资源的情况下,会请求其返回中文版对应的响应,没有中文版时,则请求返回英文版响应。

  

 4.5 Authorization

  告知服务器,用户代理的认证信息,通常想要通过服务器认证的用户代理会在接收到返回的401状态码响应后,把首部字段Authorization加入请求中。

  

4.6 Expect

   客户端使用首部字段Expect来告知服务器期望出现的某种特定行为。因服务器无法理解客户端的期望做出回应而发生错误时,会返回状态码417 Expectation Failed。

  

 4.7 From

  首部字段From用来告知服务器使用用户代理的用户的电子邮件地址。

  

4.8 Host

   首部字段Host会告知服务器,请求的资源所处的互联网主机名和端口号。请求被发送至服务器时,请求中的主机名会用IP地址直接替换解决。但如果这时,相同的IP地址下部署运行着多个域名,那么服务器就会无法理解究竟是哪个域名对应的请求。因此就需要使用首部字段Host来明确指出请求的主机名。若服务器未设定主机名,则直接发送一个空值。

  

4.9 If-Match

   形如If-xxx这种形式的请求首部字段都被称为条件请求,服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

  

 4.10 If-Modified-Since

  告知服务器若If-Modified-Since字段值早于资源的更新时间,则希望能处理该请求,而在指定If-Modified-Since字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码304 Not Modified的响应。

  

 4.11 If-None-Match

  与If-Match的作用相反。

  

4.12 If-Range

  

 4.13 If-Unmodified-Since

  告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求,如果在指定的日期时间后发生了更新,则以状态码412 Precondition Failed作为响应返回。

  

4.14 Max-Forwards

  

 4.15 Proxy-Authorization

  接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息。

  

 4.16 Range

  对于只需要获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围。

  

 4.17 Referer

   告知服务器请求的原始资源的URI。客户端一般都会发送Referer首部字段给服务器,但当直接在浏览器的地址栏输入URI,或出于安全性的考虑时,也可以不发送该首部字段。

  另外,Referer的正确拼写是Referrer,但是却一直沿用错误的拼写Referer。

  

 4.18 TE

  该字段会告知服务器客户端能够处理响应的传输编码方式及相对优先级。除了指定传输编码之外,还可以指定伴随trailer字段的分块传输编码的方式。

  

  

 4.19 User-Agent

  用于创建请求的浏览器和用户代理名称等信息传达给服务器。

  

5.响应首部字段

  响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。

5.1 Accept-Rangers

  告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。

   

5.2 Age  

   首部字段Age能告知客户端,源服务器在多久前创建了响应,字段值的单位为秒。若创建该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段Age。

  

 5.3 ETag

   告知客户端实体标识,它是一种可将资源以字符串形式做唯一性标识的方式,服务器会为每份资源分配对应的ETag值。

  

 5.4 Location

  

   使用首部字段Location可以将响应接收方引导至某个与请求URI位置不同的资源。几乎所有的浏览器在接收到包含首部字段Location的响应后,都会强制性的尝试对已提示的重定向资源的访问。

5.5 Proxy-Authorization

   把由代理服务器所要求的的认证信息发送给客户端。

   

5.6 Retry-After

  告知客户端在多久之后再发送请求。

  

5.7 Server

   告知客户端当前服务器上安装的HTTP服务器应用程序的信息。不单单会标出服务器上的软件应用名称,还有可能包括版本号和安装时启用的可选项。

   

 5.8 Vary

   

5.9 WWW-Authenticate

   用于HTTP访问认证,告知客户端适用于访问请求URI所指定资源的认证方案和带参数提示的质询。其中realm字段的字符串是为了辨别请求URI指定资源所受到的保护策略。

  

6.实体首部字段

   实体首部字段是包含在请求报文和响应报文中的实体部分所使用的的首部,用于补充内容的更新时间等与实体相关的信息。

6.1 Allow

  通知客户端能够支持Request-URI指定资源的所有HTTP方法。

  

6.2 Content-Encoding

   告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。

6.3 Content-Langeuge

  告知客户端,实体主体使用的自然语言。

6.4 Content-Length

   表明实体主体部分的大小(单位是字节)。对实体主体进行内容编码传输时,不能再使用Content-Length首部字段。

6.5 Content-Location

  给出报文主体部分相对应的URI。

  

6.6 Content-MD5

  

   首部字段Content-MD5是一串由MD5算法生成的值,其目的是在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。

6.7 Content-Range

  针对范围请求,返回响应时使用的首部字段Content-Range,能告知客户端作为响应返回的实体的哪个部分符合范围请求。

  

6.8 Content-Type

  说明了实体主体内对象的媒体类型。

6.9 Expires

  将资源失效的日期告知客户端。缓存服务器在接收到含有首部字段Expires的响应后,会以缓存来应答请求,在Expires字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。但是,当首部字段Cache-Control有指定max-age指令时,比起首部字段Expires,会优先处理max-age指令。

  

6.10 Last-Modified

  指明资源最终修改的时间。

  

7.为Cookie服务的首部字段

  Cookie的工作机制是用户识别及状态管理。Web网站为了管理用户的状态会通过Web浏览器,把一些数据临时写入用户的计算机内,接着当用户访问该Web网站时,可通过通信方式取回之前发送的Cookie。调用Cookie时,可用于检验Cookie的有效期,以及发送方的域、路径、协议等信息,所以正规发布的Cookie内的数据不会因来自其他Web站点和攻击者的攻击而泄露。

  

8.其他首部字段

  HTTP首部字段是可以自行扩展的,所以在Web服务器和浏览器的应用上,会出现各种非标准的首部字段。

  • X-Frame-Options:属于HTTP响应首部,用于控制网站内容在其他Web网站的Frame标签内的现实问题。其主要目的是为了防止点击劫持攻击。
  • X-XSS-Protection:属于HTTP响应首部,是针对跨站脚本攻击的一种对策,用于控制浏览器XSS防护机制的开关。
  • DNT:属于HTTP请求首部,Do Not Track的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。
  • P3P:属于HTTP响应首部,通过利用P3P技术,可以让Web网站上的个人隐私编程一种仅供程序理解的形式,以达到保护用户隐私的目的。

参考文献:图解HTTP(图灵程序设计丛书)

原文地址:https://www.cnblogs.com/xiaona-/p/12625159.html