HTTP首部字段是构成HTTP报文的要素之一。在客户端和服务器之间以HTTP协议进行通信的过程中,无论是请求还是响应都会使用首部字段,他能起到传递额外重要信息的作用。那么今天让我们来看看首部到底有哪些东西。
就算不知道HTTP报文首部具体有哪些东西的同学也一定知道请求行和状态行的内容。请求行由方法+URI+版本组成,状态行由版本+状态码+状态码描述组成。当然我们本博客的重点肯定不在这里,上图中除去这俩部分还剩请求首部字段,响应首部字段,通用首部字段和实体首部字段。
以前老师上课讲解时将除去请求行和状态行的剩余部分统称为请求报头,我们今天将请求/响应报头再次细分,分别来介绍不同的字段都有哪些东西。
通用首部是指,请求报文和响应报文都会使用的首部
Cache-Control
在介绍此字段之前我们先简单提一下代理服务器,代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器,代理在进行转发响应时,会将资源的副本保存在代理服务器上,当代理服务器再次接收到对相同资源的请求时,就可以不从源服务器那里获取,而是直接将之前的缓存资源作为响应返回。
而通过首部字段Cache-Control填充指令就可以操纵缓存的工作机制,多个指令之间使用 “,” 分隔开,那么现在来看看都有哪些指令。
关于Cache-Control字段的指令就介绍到这里,如果有小伙伴想了解更多可以去网上查找一下,不过掌握了这些足够了。
Connection
一看到这个字段大家就会想到关于长连接的问题,但是其实此字段还有其他作用。
Date
首部字段Date表示创建HTTP报文的日期和时间
Pragma
历史遗留字段,为了向后兼容而存在。此字段设置no-cache和Cache-Control同时设置效果相同
Trailer
首部字段Trailer会事先说明报文主体后记录了哪些首部字段。该首部字段可应用在http1.1版本分块传输编码时。
Transfer-Encoding
此字段规定了传输报文主体时应该采用的编码方式,http1.1中的传输编码方式仅对分块传输编码有效
Upgrade
此字段用于检测HTTP协议以及其他协议是否可以使用更高的版本进行通信,其参数数值可以用来指定一个完全不同的通信协议。如果服务器发现确实可以使用更高版本的协议进行通信,那么服务器返回一个状态码为101的响应。
101状态码:服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议
不过这里需要强调的是,Upgrade只适用于临接服务器之间,所以使用时一定要带上Connection字段并将Upgrade填充进去
Via
此字段用来追踪客户端和服务器之间请求和响应报文的传输路径。每当报文经过一个代理服务器、网关或者隧道时,他们就会把自己的信息也添加到via字段中
通常此字段与TREACE方法一起使用,max-forward值减到0时,代理服务器就不能在转发该请求了,此时代理服务器将自己的信息添加到via字段然后返回该请求的响应。
Warning
Warning是从http1.0响应首部retry-after演变过来的,该字段一般存放的是缓存相关的警告,笔者这里就不详细介绍了,作为了解就好。
请求首部字段是从客户端向服务器发送请求报文中使用的字段,用于添加补充请求的符加信息、客户端信息等内容
Accept
此字段通知服务器,用户代理能够处理的媒体类型以及媒体类型的相对优先级。一般使用type/subtype的格式,你肯定见过text/html这样的写法,当然了还有很多类型百度一下就会有特别全的表。
关于能够处理的类型还有优先级,优先级从0到1,假设你要给一种类型加上优先级格式为:type/subtype;q=x (x == 0 ~ 1)。
Accept-Charset
此字段通知服务器用户代理可以支持的字符集以及字符集的优先顺序。可以一次性指定多种字符集。设置方式与上文中媒体类型优先级设置方式相同。
Accept-Encoding
此字段用来告知服务器用户代理支持的内容编码以及编码的优先级顺序。
Accept-Language
此字段用来告知服务器用户代理支持的自然语言集以及自然语言集的优先级顺序。可以一次指定多种自然语言
Authorization
这个单词读作奥 Ze ruai zei 肾,此字段填写的是用户代理的认证信息。想通过服务器认证的用户代理会在接收到返回401的状态码响应后,会把此字段放入请求中。
Except
客户端使用首部字段Except来告知服务器,期望出现某种特定的行为,如果服务器无法理解客户端希望做出的行为时将会返回417状态码。然而http1.1中只定义了关于100 continue的拓展,如果你希望发生100 continue事件。那么在此字段写上100-continue即可。
Form
此字段一般填充的是用户代理的用户的电子邮件地址,使用代理时尽可能使用From首部字段。
Host
此字段非常重要,是http1.1规范中唯一一个必须被包含在请求内的首部字段。此字段告诉服务器,请求的的资源所处的互联网主机名字和端口号。
首部字段Host和单台服务器分配多个域名的虚拟主机的工作机制具有很密切的关联,这是Host必须存在的意义。请求被发送至服务器时,请求中的主机命会被ip地址直接替换解决。但是如果此时相同的ip地址下部署着多个域名,那么服务器就会无法理解究竟是哪个域名对应的请求。因此使用此字段Host来明确请求的主机名。若服务器未设定主机名,那么直接发送一个空值即可。
if
这里并没有一个字段是名叫的if的,而是我们请求头部很多字段都是以if开头的,带有if开头的字段的请求叫做条件请求,只有判定条件为真时,才会执行请求。
Max-Forwards
前面我们已经提到过这个字段了,这个字段在请求报文发送之前填充一个值,每经过一个代理服务器就减一,当值减为0时就不在进行转发,直接进行返回响应。
那么为什么需要这个字段呢?使用HTTP协议进行通信时,请求可能经过代理等多太服务器。途中如果由于某种原因导致转发失败,客户端也就等不到服务器的响应了,对此我们也就无从得知了。并且在有的情况下报文会在俩个服务器之间陷入死循环转发,这样Max-Forwards减到0时返回响应就不会无限循环了。
Range
此字段告诉请求服务器资源的指定范围,如果服务器成功处理范围请求就会返回206响应。无法处理该范围请求时,则会返回状态码200 ok以及全部资源。
Referer
此字段告诉服务器请求的原始资源的URL,但是处于安全性的考虑也可以不发送此字段。因为大家都知道URL中可能包含ID和密码等私密信息,如果写入此字段发送给其他服务器就可能造成安全性的问题。
一个小插曲,Referer正确的拼写应该是Referrer,但是不知道为什么http协议中一直使用错误的前者。
User-Agent
User-Agent会将创建请求的浏览器和用户代码名称等传达给服务器,由网络爬虫发起请求时,有可能会在字段中添加爬虫作者的电子邮件地址。除此,代理服务的信息也可能会被添加到此字段中。
关于此字段的历史混乱大战的故事有兴趣的老铁可以戳链接看看哦,User-Agent的历史故事。
响应首部字段是由服务器向客户端返回响应报文所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。
Accept-Ranges
此字段是服务器告诉客户端是否能处理范围,以指定获取服务器端某个部分的资源。可指定的值有俩种,可处理范围请求时指定为bytes,反之则指定其为none。
Age
首部字段Age能告诉客户端,源服务器在多久之前创建了响应。字段的单位为秒。如果创建响应的时缓存服务器,Age的值是指缓存在的响应再次发起到认证完成的时间,代理创建响应时必须加上首部字段Age。
Etag
Etag字段能告诉客户端实体标识。它可以将资源以字符串形式做唯一标识。服务器会为每份资源分配对应的Etag值。另外,当资源更新是,Etag值也需要更新。生成Etag值时,并没有统一的算法规则,而是由服务器分配。
资源被缓存时,会被分配唯一性标识。以中文浏览器访问时返回中文资源,以英文浏览器访问时返回英文资源。但是我们访问的是同一个URL,使用同一个URL标识俩份资源是非常困难的,所以要使用Etag来标识这两份资源。
Etag又被分为强Etag和弱Etag值之分。强Etag值,不论实体发生多么细微的变化都会改变其值。弱Etag值只用于提示资源是否相同。只有资源发生了根本的变化,产生的差异才会改变Etag。这是会在字段值最开始处附加W/。
Location
使用Location字段可以将响应接收方引导至某个与请求URI位置不同的资源。几乎所有的浏览器在接收包含字段Location的响应后,都会强制性地尝试对已经提示的重定向资源的访问。
Retry-After
此字段告诉客户端应该多久之后再次发送请求。主要配合状态码503,或者3xx响应一起使用。
Server
首部字段Server告知客户端服务器上安装的HTTP服务器应用程序的信息,还有可能包含版本号和安装启用的可选项。
此字段是实体部分所使用的首部,用于补充内容的跟新时间和实体相关的信息。
Content-Encoding
此字段告诉客户端服务器对实体的主体部分进行的编码方式。内容编码是指在不丢失实体信息的情况下所进行的压缩。
Content-Language
此字段告诉客户端服实体主体使用的自然语言
Content-Length
表明实体主体部分的大小
Content-Type
表明实体主体内对象的媒体类型,和上面请求首部字段的Accept填充的格式完全相同
Content-Location
表示实际被返回的URL是多少,因为有时候存在你访问的对象和返回的对象不同的情况,所以有必要设置此字段
Last-Modified
此字段指明资源最终被修改的时间。
Expires
此字段会将资源失效的日期告诉客户端。缓存服务器在接收到含有首部字段Expires后会以缓存来应答请求,在Expires字段值指定的时间之前,响应的副本一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。