http报文分为3部分:请求行/状态行、报文首部和报文主体。
请求行:GET /home HTTP/1.1 (请求方法、URI和协议版本)
响应行:HTTP/1.1 200 ok (协议版本、状态码和原因短语)
首部字段
作用:在请求的时候,可以给浏览器和服务器提供额外的信息,包括报文主体大小、所使用的语言和认证信息等
首部字段信息根据它的功能分为以下4种,并列举其包含的比较重要的字段信息:
1. 通用首部字段
通用首部字段指的就是请求和响应的时候都会用到的首部字段。
cache-control
cache-control这个字段比较复杂,可以同时用在请求头和响应头中,并且分别代表不同的意思。
- public:(服)此缓存资源可作为公共资源
- private:(服)此缓存资源只能给特定用户提供
- no-cache:(客)不接受缓存过期的资源,即每次缓存服务器都要找服务器确认。(服)不允许缓存服务器缓存资源。
- no-store:(客、服)不允许缓存服务器缓存请求的任意部分。
- max-age:(客)如果缓存资源的时间已经超过max-age,缓存服务器就会重新向服务器发请求。(服)允许缓存服务器自行处理请求的时间,不必向服务器发出确认请求。
- min-fresh:(客)告知缓存服务器,x秒内过期的资源也不要给我了。
- max-stale:(客)告知缓存服务器,x秒内过期的请求还可以发给我。
- no-transform:(客、服)不要改变我报文主体中的媒体类型(不要压缩图像之类的)
- only-if-cached:(客)告知缓存服务器,不要去重新请求,也不需要向服务器确认资源有效性,如果有缓存就给我,没有就就算了(返回504)
- must-revalidate:(服)缓存服务器必须向源服务器确认资源的有效性,若无法确认则返回504。
- proxy-revalidate:(服)要求缓存服务器对缓存的有效性再次进行确认。
date
如果没有缓存,Date就是生成响应的时间,如果有缓存,Date就是响应被缓存的时间。
progma
HTTP1.1之前的历史遗留字段,用于兼容HTTP1.1之前版本的缓存服务器。 program:no-cache
所以为了兼容所有版本的服务器:
cache-control:no-cache
program:no-cache
Transfer-Encoding
在传送报文主体信息时,需要对主体信息进行转换编码的方式,仅用在分块传输编码中。
(服)Transfer-Encoding:chunked
Connection
(1).控制逐跳首部
Connection:upgrade 告知代理服务器转发时可无需再次携带
(2).管理持久链接
HTTP1.1版本默认都是持久链接,当服务器端想要断开链接时,就会指定
Connection:false
HTTP1.1之前的版本默认都是非持久链接,为了保持持久的链接,都会指定
Connection:keep-alive
2. 请求首部字段
请求首部字段用于补充发送请求时,客户端的信息、请求的附加信息和对响应内容相关的优先级等。
Accept
表示客户端期望服务器返回的媒体类型。(逗号隔开类型、分号分割属性,q表示权重值)
Accept: audio/*; q=0.2, audio/basic
Accept-Charset
表示客户端期望服务器返回的字符集的类型。(逗号隔开类型、分号分割属性,q表示权重值)
Accept-Charset: utf8, gbk; q=0.6
Accept-Encoding
表示客户端期望服务器返回的编码压缩方式。
Accept-Encoding:gzip,deflate
Accept-Language
表示客户端期望服务器返回的语言集。
Authorization
告知服务器,用户代理的认证信息,对于特殊权限才可访问的某个网站来说,Authorization可提供证书值或用户名密码。(用于客户端和服务器之间的认证)
Host
一个IP地址可能部署了多个域名,发送请求时,服务器不明白是对哪个域名的请求,所以就需要Host字段来指明请求的主机名。
if开头的都是条件请求,当服务器满足if条件时,就会执行该请求,否则就不执行。
if-Match
只有当if-Match的字段值与服务器资源的ETag值相等的时候,服务器才会接受请求。
if-None-Match
与if-Match相反,当服务器存在的ETag与if-None-Match字段的值不相等的时候,就会处理请求。用于获取最新的数据。
if-Modified-Since
当服务器的资源在if-Modified-Since指定的时间之后有更新的话,就处理该请求。
if-Modified-Since的值就是last-modified的值,last-modified表示的是最近一次修改的时间。if-Modified-Since其实就是向服务器确认自从上次修改之后,资源有没有发生更新,有的话,服务器就接受请求,否则就不接受请求。
if-Unmodified-Since
与if-Modified-Since相反,告知服务器,资源在if-Unmodified-Since的时间段之后未发生改变,就开始处理请求。
if-Range
if-Range:'123456' Range:bytes=500-1000
如果服务器ETag与if-Range中的字段值一致,则服务器作为部分请求处理。 如果不一致,就返回新的全部资源。
Proxy-Authorization
同Authorization,用于客户端和代理之间的认证。
Range
用于获取部分资源的请求,Range可以表示范围的区间。
Referer
告知服务器请求的原始URI
3. 响应首部字段
响应首部字段用于补充响应的附加信息、服务器信息以及对客户端的附加要求。
Accept-Ranges
Accept-Ranges:bytes 告知客户端可处理范围请求
Accept-Ranges:none 告知客户端不可处理范围请求
Age
表示资源缓存的年龄。
ETag
该字段表示资源的实体标识。不同的资源、资源变化都对应不同的ETag标识。一般用来与if-Match\if-not-Match配合使用,用来判断资源缓存的有效性。
Location
服务端产生302重定向的时候,一般会返回该字段,表示重定向后的地址。
HTTP/1.1 302 Temporary Redirect Location: https://www-temp.example.org/
WWW-Authenticate
WWW-Authenticate是401 Unauthorized错误码返回时必须携带的头,该头会携带一个问题Challenge给客户端,告知客户端需要携带这个问题的答案来请求服务器才可以继续访问目标资源。(用于服务器与客户端之前的响应)
Proxy-Authenticate
同上,用于代理服务器与客户端之间的响应。
Server
用于返回服务器相关的软件信息,来告知客户端当前的HTTP服务是由某某软件提供的,可以看成是一种软件广告。
Vary
该头部用于缓存控制。对于一些缓存服务器,我们在请求里加入Vary参数可以告知缓存服务器对不同的Vary参数的响应使用不同的缓存单元。比如Vary参数里放入编码参数,那么不同编码的网页就会有不同的缓存。Vary的值可以有多个,只要任意一个值不一样就会有不同的缓存。
Vary: Accept-Encoding,Accept-Language
4. 实体首部字段
实体首部字段是报文主体中的、用于补充报文内容更新时间、报文内容等相关信息的头部。
Allow
表示服务端告知客户端它所支持的HTTP方法。
Allow: GET, HEAD, PUT
Content-Encoding
告知客户端,服务器端对实体内容部分采用的编码方式。
Content-Language
告知客户端,服务器端对实体内容部分使用的语言集。
Content-Length
告知客户端,服务器端实体内容的长度。
Content-Location
告知客户端,服务器端实体内容来自哪个URI。
Content-Range
告知客户端,服务器端返回的实体内容的范围。
Content-Type
告知客户端,服务器端返回的实体内容的媒体类型。
Expires
表示资源失效的时间。缓存服务器会以此字段为标准,时间超过本字段,就会重新向服务器发请求,否则,就是用缓存。
当Expires的时间等于Date的时间,就表示资源已经失效。
当cache-control有指定max-age的时候,会忽略expires字段,优先处理max-age。
last-Modified
资源上次被修改的时间。