跟HTTP首部有关的知识也是容易被忽略的。之前自己做写东西时,发现对HTTP首部的了解远远不够。所以,也是稍微多学习一下。
HTTP首部在我们使用web服务的过程中是一直存在的,虽然我们难以感受到它。
在HTTP请求报文中,http报文由请求行(包括方法,URI和http版本)和HTTP首部字段组成。
- 在HTTP请求报文中,HTTP报文由请求行(包括方法,URI和http版本)和HTTP首部字段组成。
- 在HTTP响应报文中,HTTP报文由状态行(包括HTTP版本和状态码)和HTTP首部字段组成。
HTTP首部字段
HTTP首部字段是构成HTTP报文的重要元素之一。HTTP报文时用来传递额外的重要信息的。
HTTP首部字段结构
HTTP首部字段是由首部字段名和字段值组成的,中间用冒号隔开。
Content-type: text/html
以上例子中,Content-Type是首部字段名,text/html是字段值。
据我观察,首部字段名单词首字母均大写,而且单词之间用横线分开。
值得注意的是,字段值对应单个HTTP首部字段可以由多个值。如:
Keep-Alive: timeout=15, max=100
根据用途,HTTP首部字段被分为:
- 通用首部字段
- 请求首部字段
- 响应首部字段
- 实体首部字段
常见的首部字段
Cache-Control
跟缓存有关的字段,可以操作缓存的工作机制。
Cache-Control: no-cache
如果请求中包含此字段,表示强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。
Cache-Control: max-age=600
表示如果判定缓存资源的缓存时间数值比指定时间的数值小,那么就接受缓存的资源。
据观察,很多网站好像一般max-age都是设为0。
Connection
Connection: Keep-Alive
常用的是Keep-Alive这个值,是为了在旧版本的HTTP协议上维持持续链接,HTTP/1.1之后的默认都是持久连接了。
Date
表示创建HTTP报文的日期和时间,太常见。
Via
这个字段可以追踪客户端与服务器之间的请求和响应报文的传输路径。每经过一个代理服务器就会在首部附加服务器相应的信息。
If-Match
使用了这条首部字段的话,服务器会比对If-Match的字段值和资源的ETag值,当且仅当两者一致时,才会执行请求。
将字段值设为星号会忽略ETag的值,如果资源存在,就处理请求。
If-Modified-Since
If-Modified-Since的字段值是一个时间,如果请求的资源在这个字段值的时间之后都没更新过,就返回304 Not Modified的响应。
服务器会把这个时间与服务器上实际文件的最后修改时间进行比较
如果时间一致,那么返回HTTP状态码304(不返回文件内容),客户端接到之后,就直接把本地缓存文件显示到浏览器中。
如果时间不一致,就返回HTTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。
Range
Range首部字段可以向服务器请求服务器。
形如 Range: bytes=0-5000,这个例子表示请求的是0字节到5000字节的资源。
接收到附带 Range 首部字段请求的服务器,会在处理请求之后返回状 态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返 回状态码 200 OK 的响应及全部资源。
User-Agent
可以将浏览器等的信息传达给服务器,起到识别客户端一些信息的作用。
ETag
ETag字段可以将实体的标识告知客户端。通俗点讲就是用字符串的形式唯一地表示资源。如果资源更新了,ETag值也会更新。
Location
Location字段可以将响应的接收方引导到另外一个URI,而不是原先请求的URI。
有个例子,比如用在浏览器地址栏输入jd.com访问,会发生两次3xx的响应,表示重定向,第三次响应的URI是https://www.jd.com/,此时的状态码是200。