【HTTP图解】6-HTTP首部
HTTP报文首部
HTTP协议中的请求和响应报文中必定含有HTTP首部。首部内容客户端和服务器分别处理请求和响应提供所需要的信息。对于客户端用户来说,这些信息中的大部分内容都无须亲自查看。
请求报文
访问百度时,请求报文的首部信息:
GET /sugrec?prod=... HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://www.baidu.com/
Connection: keep-alive
Cookie: ...
响应报文
百度返回的响应报文的首部信息:
HTTP/1.1 200 OK
Content-Length: 258
Content-Type: text/plain; charset=UTF-8
Date: Sat, 25 Jul 2020 05:21:11 GMT
HTTP首部字段
使用首部字段是为了给浏览器和服务器提供报文主题大小,所使用的语言、认证信息等内容。
首部字段结构
首部字段名:字段值
首部字段类型
一共有4种:
- 通用首部字段
- 请求首部字段
- 响应首部字段
- 实体首部字段
非HTTP/1.1首部字段
在HTTP协议中通信交互中使用到的首部字段,不限于RFC2616中定义的47种首部字段,还有Cookie、Set-Cookie和Cootent-Disposition等在其他RFC中定义的首部字段,他们的使用频率也很高。
End-to-end首部
HTTP首部字段将定义成缓存代理和非缓存代理的行为,分成2种类型
分在此类型中的首部会转发给请求/响应对应的最终接受目标,且必须保证在由缓存生成的响应中,另外规定它必须被转发。
Hop-by-hop首部
分在此类别的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1和之后版本中,如果要使用hop-by-hop首部,需提供Connection首部字段。
在HTTP/1.1中,除了上面8个首部字段之外,其他所有字段都属于端到端首部。
HTTP/1.1通用首部字段
Cache-Control
通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。
-
public
表示其他用户也可利用此缓存。 -
private
表示响应只以特定的用户作为对象 -
no-cache
为了防止从缓存中返回过期的资源- 客户端请求包含该请求,表示客户端将不会接受缓存过的响应
- 服务器响应包含该指令,那么缓存服务器不能对资源进行缓存。源服务器以后也不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。
-
no-store
暗示请求和对应的响应中包含机密信息,因此,该指令规定缓存不能在本地存储请求或响应的任一部分。 -
s-maxage
指定缓存期限,同max-age
,不过该指令只适用于供多位用户使用的公共缓存服务器(代理)。也就是说,对于同一用户重复返回响应的服务器来说,这个指令没有任何作用。 -
min-fresh
要求缓存服务器返回至少还未过指定时间的缓存资源 -
max-state
可指示缓存资源,即使过期也照常接收 -
only-if-cached
表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。 -
must-revalidate
,代理会向源服务器再次验证即将返回的响应缓存目前 -
proxy-revalidate
要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。 -
no-transform
规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型,防止缓存或代理压缩图片等类似操作 -
cache-extension token
通过该标记,可以扩展Cache-Control首部字段内的指令
仅对理解它的缓存服务器来说是有意义的。
Connection
具有以下两个作用:
- 控制不再转发给代理的首部字段
- 管理持久连接
HTTP/1.1版本的默认连接都是持久连接,为此,客户端会在持久连接上连接发送请求。当服务器端想明确断开连接时,指定Conection字段为Close
Date
表明创建HTTP报文的日期和时间
Progma
遗留字段
Trailer
会事先说明在报文主体后记录了哪些首部字段,该首部字段可应用在HTTP/1.1版本分块传输编码时。
Transfer-Encoding
规定了传输报文主体时采用的编码方式
Upgrade
用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
Via
为了跟踪客户端与服务器端之间的请求和响应报文的传输路径。
报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发
Warning
告知用户一些和缓存相关问题的警告
格式:
Warning: [警告码][警告的主机:端口号] "[警告内容]" ([日期时间])
请求首部字段
Accept
可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可以使用type/subtype这种形式,一次指定多种类型。
Accept-Charset
可以通知服务器用户代理支持的字符集集字符集的相对有限顺序。另外,可一次性指定多种字符集。与首部字段Accept相同的是可用权重q值来表示相对优先级。
该首部字段应用于内容协商机制的服务器驱动协商。
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
Accept-Encoding
用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。
Accept-Encoding: gzip, deflate
常见的内容编码的例子
- gzip
- compress
- deflate
- identity
Accept-Language
用来告知服务器用户代理能够处理的自然语言集,以及自然语言集的相对优先级。可一次指定多种自然余元语言集。
Authorization
告知服务器的用户代理的认证信息
通常,想要通过服务器认证的用户代理会在接收到返回的401状态码响应后,把首部字段Authorization加入请求中。共有缓存在接收到含有Authorization首部字段的请求时的操作处理会略有差异。
Expect
客户端使用该字段告知服务器,期望出现的某种特定行为。因服务器无法理解客户端的期望做出回应而发生错误时,会返回状态码417 Expectation Failed
From
告知服务器使用用户代理的用户的电子邮件地址
Host
首部字段Host和以单台服务器分配多个域名的虚拟主机的工作机制有很密切的关联,这是首部字段Host必须存在的意义。
请求被发送至服务器时,请求中的主机名会用IP地址直接替换解决。
但如果这时,相同的IP地址部署运行着多个域名,那么服务器就会无法理解究竟是哪个域名对应下的请求。因此,就需要使用首部字段Host来明确指出请求的主机名。
若服务器未设定主机名,那直接发送一个空值即可。
Host:
If-Match
形如If-xxx这种形式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
If-Modified-Since
告知服务器若If-Modified-Since字段值早于资源的更新时间,则希望能处理该请求。
如果过期,返回304 Not Modified的响应。
If-None-Match
If-Range
If-Range与If-Match的差别就是,如果不满足条件,If-Range把所有资源返回,而If-Match则返回412状态码
If-Unmodified-Since
和If-Modified-Since相反
Max-Forwards
指定最大跳转次数,防止发生在代理服务器之间发生环路,进入无限循环。
Proxy-Authorization
接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息。
Range
对于只需获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围。
Referer
告知服务器请求的原始资源的URI,但处于安全考虑,浏览器的地址栏输入URI,也可以不发送该首部字段,因为原始资源的URI中的查询字符串可能含有ID和密码等保密信息,要是写进Referer转发给其他服务器,则有可能导致保密信息的泄露。
TE
告知服务器客户端能够处理的传输编码方式及相对优先级吗,与Accept-Encoding的功能很像,但是用于传输编码。
TE: gzip, deflate; q=0.5
User-Agent
创建请求的浏览器和用户代理名称等信息传达给服务器。
响应首部字段
Accept-Ranges
告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。
Age
告知客户端,源服务器在多久前创建了响应,字段值的单位为秒。
若创建该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时,必须加上首部字段Age
ETag
告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag值。
ETag有强弱之分,强的无论实体发生多么细微的变化都会改变,弱的只有资源发生了根本改变,产生差异时才会改变ETag值。这时,会在字段值最开始处附加W/
ETag: W/"usagi-1234"
Location
使用首部字段Location可以将响应接受方引导至某个与请求URI位置不同的资源。
Proxy-Authenticate
会把代理服务器所要求的认证信息发送给客户端。
Retry-After
告知客户端应该多久之后再次发送请求。
Server
告知客户端当前服务器上安装的HTTP服务器应用程序的信息
baidu.com
Server: BWS/1.1
Vary
WWW-Authenticate
用于HTTP访问认证
实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。
Allow
用于通知客户端能够支持Request-URI指定资源的所有HTTP方法。
Content-Encoding
内容编码方式
Content-Language
Content-Length
实体主体部分的大小(单位是字节)
Content-Location
给出与报文主体部分相对应的URI,和首部字段Location不同,Content-Location表示的是报文主体返回资源对应的URI
比如,对于使用首部字段Accept-Language的服务器驱动型请求,当返回的页面内容与实际请求的对象不同时,首部字段Content-Location内会写明URI
Content-MD5
目的:检查报文主体在传输过程中是否保持完整,以及确认传输到达。
Content-Range
告知客户端作为响应返回的实体的哪个部分符合范围请求。字段值以字节为单位,表示当前发送部分及整体实体大小。
Content-Type
说明了实体主体内对象的媒体类型。和首部字段Accept一样,字段值用type/subtype形式赋值。
Expires
会将资源失效的日期告知客户端。
Last-Modified
指明资源最终修改的时间。
为Cookie服务的首部字段
其他首部字段
X-Frame-Options
属于HTTP响应首部,用于控制网站内容在其他Web而网站的Frame标签内的现实问题。其主要目的是为了防止点击劫持攻击
X-XSS-Protection
属于HTTP响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器XSS防护机制的开关。
DNT
属于HTTP请求首部,DNT(Do Not Track),意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。
P3P
属于HTTP响应首部,通过利用P3P(The Platform for Privacy Preferences)技术。
可以让Web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。