1. Accept
定义:可以接收的返回数据类型。服务端会根据该字段,选择其支持的权重最高的内容形式返回。
示例:
(1)可以是多个值,用逗号隔开,如
Accept: application/json, text/plain
(2)也可以增加权重,不设置权重则默认为1,如
Accept: application/json;q=0.5, text/plain
场景实例:
服务器使用了spring的@ResponseBody注解,并且配置了xml、json的converter,如果此时accept为*/*,则服务器会按自己的逻辑选择converter,可能会返回application/xml格式的数据,如果客户端只能处理json数据,则需要声明为application/json,则服务器会返回json格式的数据。
2. Accept-Encoding
定义:支持的内容编码方式。
示例:
(1)可以是多个值,用逗号隔开,也支持使用q表示权重,其中identify表示不压缩
Accept-Encoding: gzip, compress, deflate, identify
(2)*表示任意
Accept-Encoding: *
作用:告知服务器支持的编码方式,服务器可根据此对数据进行压缩,减少传输时间。
场景实例:
使用nginx服务器部署静态资源,有时候会发现资源文件太大,传输太慢。其实浏览器发起请求时已经带上了Accept-Encoding: gzip, deflate,只要在nginx中开启gzip则可以实现压缩之后再传输。
3. Cache-Control
定义:控制缓存的工作机制。
示例:
Cache-Control: no-cache
Cache-Control: max-age=0
Cache-Control: public, no-cache, max-age=0
场景实例:
以nginx部署静态资源为背景
(1)对于希望客户端缓存的文件(强制缓存),可以在nginx.conf中配置expires 30s,这样nginx返回的响应头中就会带上Cache-control: max-age=30,浏览器接收到数据后会缓存起来,并在30秒以内直接使用缓存,30s过后再次请求会向服务器请求校验缓存是否合法,服务器可能返回新的数据或者返回304。
(2)对于希望客户端缓存但每次都要校验是否过期的文件(协商缓存),可以在nginx.conf中配置expires 0s,这样nginx返回的相应头中就会带上Cache-control: max-age=0,浏览器接收到数据后会缓存起来,并在下一次请求时向服务器请求校验缓存是否合法,服务器可能返回新的数据或者返回304。
(3)每次通过在浏览器地址栏输入URL访问资源,浏览器都会自动带上Cache-control: no-cache的头部字段,意味着希望重新从目标服务器获取资源,而不从中间的代理服务器中取缓存资源。
4. If-Modified-Since
定义:校验资源是否在指定时间后修改过
示例:
If-Modified-Since: Wed, 10 Oct 2018 08:56:00 GMT
场景实例:
以下两种情况缓存均已过期
(1)上一个响应的头部包含Cache-control: max-age=0时
(2)上一个响应的头部包含Cache-control: max-age=30且30秒已过
需要再发一次请求到服务器校验数据是否被修改,此时请求需要带上If-Modified-Since,值为上一个响应的Last-Modified字段。服务器检查资源是否被修改,如果没有返回304,如果被修改返回新的资源。
5. Connection
定义:
(1)管理持久连接
(2)控制不再给代理的首部字段
示例:
Connection: Keep-Alive
Connection: close
Connection: Upgrade
Upgrade: Websocket
场景实例:
(1)由于打开一个网页一般需要从同一个服务上获取多个资源,请求头会默认带上Connection: Keep-Alive,表示重用TCP连接,当获取最后一个资源时,不再需要该TCP连接时,可以带上Connection: close。
(2)Upgrade: Websocket一般与Connection: Upgrade配合使用,只可作用于临接服务器。如果客户端经过Nginx来请求目标服务器,则到达目标服务的请求会没有Upgrade: Websocket的头部字段,于是需要在nginx中配置为该请求加上这两个请求头部字段,才能实现客户端经过Nginx与目标服务器进行websocket通讯。
6. Upgrade
定义:升级为其它协议
示例:
Connection: Upgrade
Upgrade: Websocket
场景实例:
(1)客户端发起websocket连接时,会先发起一个HTTP请求,Upgrade字段为websocket,服务器判断支持websocket后返回101,接下来使用websocket协议通讯。
(2)浏览器发起mqtt over websocket连接时,会先发起一个HTTP请求,Upgrade字段为mqttv3.1,服务器判断是否支持该版本的mqtt协议决定是否继续通讯。
7. Content-Length
定义:实体主体的长度,单位为byte。
示例:
Content-Length: 1500
场景实例:
由于TCP会产生粘包,无法分割多个HTTP报文,就需要使用头部的Content-Length字段来判断该HTTP请求到哪里结束。当使用分片传输,或者报文经过压缩时,没有此字段。
8. Host
定义:请求的域名
示例:
Host: www.baidu.com
场景实例:
通常情况下,一个物理机器会部署了多个服务,我们通过Nginx监听80端口,将不同域名的请求转发到对应服务。当浏览器发送一个HTTP请求时,会向DNS查询IP地址,并把请求发送到该IP地址的指定端口,此时会带上Host字段表明是哪个域名发起的请求,服务器通过请求头中的Host字段来判断应该转发到哪个服务。
9. Origin
定义:请求的来源
示例:
Origin: http://localhost
场景实例:
当网页需要提交一个跨域POST请求(Content-Type为application/json),会先发送一个OPTION请求,并且带上头部字段Origin,服务器会检查是否允许该源头提交跨域请求,如果允许,返回200,否则返回403 Forbidden。
10. Referer
定义:请求是从哪个网页发起的
示例:
Referer: https://www.baidu.com/
场景实例:
(1)服务器可以通过此字段来统计发起请求的来源
(2)可以通过该字段来判断是否跨站请求,如果是则禁止访问来防止跨站请求伪造,但是由于该字段可能会被篡改,所以不是特别可靠。
10. User-Agent
定义:提供浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。
示例:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36
场景实例:
(1)当我们通过手机端访问网页和通过电脑访问网页,服务器会根据UA来返回不一样的结果来适配不同的客户端/浏览器。
(2)服务器可以根据UA来统计用户使用的客户端/浏览器信息,从而更加注重该类型客户端/浏览器的体验。
(3)服务器可以根据UA来判断请求是否由网络爬虫发出,如果UA的值不是普通的浏览器,则禁止访问。但是,网络爬虫也可以直接伪造UA的值来破解。