http 报文首部

HTTP报文首部起到传递额外重要信息的作用。

HTTP请求报文首部由方法、URI、HTTP版本、请求首部字段、通用首部字段、实体首部字段构成。

HTTP响应报文首部由HTTP版本、状态码、响应首部字段、通用首部字段、实体首部字段构成。

http 首部字段的四种类型

HTTP首部字段根据实际用途被分为以下四类:

  • 通用首部字段(General Header Fields)

    请求报文和响应报文都会使用的首部

  • 请求首部字段(Requset Header Fields)

    从客户端向服务端发送请求报文时使用的首部。

  • 响应首部字段(Response Header Fields)

    从服务端向客户端返回响应报文时使用的首部。

  • 实体首部字段(Entity Header Fields)

    针对请求报文和响应报文的实体部分使用的首部。

    End-to-end 首部和Hop-by-hop 首部

    HTTP首部字段将定义成缓存代理和非缓存代理的行为。

  • 端到端首部

    分在此类别的首部会转发给请求/响应对应的最终接收目标,且必须保存在由缓存生成的响应中。另外规定他必须被转发。

  • 逐跳首部

    分在此类别的首部只对单次转发有效,会因通过缓存或代理而不再转发。

    通用首部字段

    Cache-Control

  • public指令(仅为响应指令)

    表明其他用户也可利用缓存。

  • private指令(仅为响应指令)

    响应只以特定的用户作为对象,对应其他用户发送过来的请求,代理服务器不会返回缓存。

  • no-cache

    位于请求首部:表明客户端不接受缓存过的响应,“中间”的缓存服务器必须把客户端的请求转发给源服务器。

    位于响应首部:响应中包含no-chche指令,则缓存服务器不对资源进行缓存。

  • no-store

    规定缓存不能在本地存储请求或响应的任一部分。

  • max-age

    当发送的请求包含max-age指令时,判断缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。值为0时,那么缓存服务器会将请求转发给源服务器。

    当返回的响应包含max-age指令时,缓存服务器不再对资源的有效性进行确认,max-age代表资源保存为缓存的最长时间。

    HTTP/1.1遇到同时存在Expries字段时,优先处理max-age。HTTP/1.0则相反。

  • s-maxage(仅为响应指令)

    与max-age的唯一区别是,s-maxage仅仅应用于共享缓存。而不引用于用户代理的本地缓存,等针对单用户的缓存。另外,s-maxage的优先级要高于max-age和Expries。

  • min-frassh(仅为请求指令)

    要求缓存服务器返回至少还未过指定时间的缓存资源。

  • max-stale

    指示缓存资源,过期也照样接收或返回。
    指定数值,即使过期,在指定数值之内,依然接收或返回。

  • only-if-cached(仅为请求指令)

    表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。若请求缓存服务器的本地缓存无响应则返回状态码504。

  • must-revalidate(仅为响应指令)

    指明代理服务器会向源服务器验证即将返回的响应缓存目前是否有效。

    若无法连通源服务器,返回504。

    在该指令存在的条件下,忽略max-stale指令。

  • proxy-revalidate(仅为请求指令)

    要求代理服务器在接收到具有该指令的请求返回响应之前,必须再次验证资源的有效性。

  • no-transform

    要求缓存不能改变实体资源的媒体类型,可防止缓存或代理压缩图片等操作。

  • cache-extension token

    通过cache-extension标记(token),可以扩展Cache-Control首部字段的指令。

    extension token仅对能理解它的缓存服务器来说是有意义的,不能理解则忽略。

    Connection

    • 控制不再转发给代理的首部字段
    • 管理持久连接

    HTTP/1.1默认连接都是持久连接。客户端会在持久连接上连续发送请求。当服务端想明确断开连接时,则指定Connection首部字段的值为close。

    HTTP/1.1之前的HTTP版本的默认连接是非持久化连接,为此,要在旧的协议版本维持持续连接需要指定Connection为keep-alive。

    Date

    表明创建HTTP报文的日期和时间

    Pragma

    HTTP/1.1之前版本的遗留字段,仅作为和HTTP/1.0向后兼容而定义。

只用在客户端发送的请求中,要求所以的中间服务器不返回缓存的资源。

为了兼容HTTP/1.1及其之前的版本,发送的请求会同时包含两个字段

1
2
Cache-Control: no-cache
Pragma: no-cache

Trailer

Trailer会事先说明在报文主体后记录了哪些首部字段,也用于分块编码传输。

Transfer-Encoding

Transfer-Encoding规定传输报文主体时采用的编码方式。

Upgrade

Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行通信。

Via

追踪客户端和服务器之间的请求和响应报文的传输路径,避免请求回环的发生。

报文经过代理和网关时,会先在首部字段Via中附加该服务器的信息,再进行转发。

Warning

该首部通常会告知用户一些缓存相关问题的警告。

请求首部字段

Accept

用于通知服务器,用户代理可以处理的媒体类型及媒体类型的相对优先级。

增加优先级,使用q=来表示权重的值。范围为0~1.0,1为最大,默认为1。

Accept-Charset

通知服务器用户代理支持的字符集和字符集的相对优先顺序。权重设置方式与Accept相同。

Accept-Encoding

告知服务器用户代理支持的内容编码及内容编码的优先顺序。

Accept-Language

告知服务器用户代理支持的自然语言集及自然语言集的优先顺序。

Authorization

告知服务器,用户代理的认证信息。

From

告知服务器使用用户代理的电子邮件地址。

Host

告知服务器,请求的资源所处的互联网主机名和端口号。

If-Match

If-xxx的字段称为条件请求,服务器接受到附带条件的请求后,只有判断条件为真时,才会执行请求。

If-Modified-Since

告知服务器若If-Modified-Since字段值早于资源的更新时间,则希望处理该请求。

若再If-Modified-Since字段值的时间之后资源没有更新过,返回304状态码。

获取资源的更新日期,可通过首部字段Last-Modified来确定。

Range

告知服务器资源的指定范围,服务器返回206 Partial Content的响应。

Referer

告知服务器请求的原始资源的URI。

User-Agent

Use-Agent字段会将创建请求的浏览器和用户代理名称等信息传达给服务器。

响应首部字段

Accept-Range

告知客户端服务器是否能处理范围请求,以指定获取服务端某个部分的资源。

可处理时指定为btyes,反之为none。

Age

告知客户端源服务器在多久之前创建了响应,单位为秒。

ETag

告知客户端的实体标示。

服务器会为每份资源分配对应的ETag值。

Location

可以将响应接收方引导至某个与请求URI位置不同的资源。

几乎所有浏览器在接收到包含Location首部字段的响应后,都会强制性地尝试对已提示的重定向资源的访问。

Proxy-Authenticate

将由代理服务器所要求的认证信息发送给客户端。

Retry-After

告知客户端多久之后再次发起请求。

Server

告知客户端当前服务器上安装的HTTP服务器应用程序的信息。

WWW-Authenticate

用于HTTP访问认证。

实体首部字段

Allow

用于通知客户端能够支持的Request-URI指定资源的HTTP方法。当服服务器接受到不支持的HTTP方法时,会以状态码405 Method Not Allowed作为响应返回。

Content-Encoding

告知客户端服务端对实体的主体部分选用的内容编码方式。

主要采用以下4种编码方式:

  • gzip
  • compress
  • deflate
  • identity

    Content-Language

    告知客户端实体主体使用的自然语言。

    Content-Length

    表明实体主体部分的大小,单位为字节。

    Content-Location

    给出与报文主体部分像对应的URI。

    Content-MD5

    客户端对接受的报文主体执行相同的MD5算法,然后与首部字段的Content-MD5字段值进行比较。

    Content-Range

    告知客户端作为响应返回的实体的哪个部分符合范围请求。

    Content-Type

    说明主体实体内对象的媒体类型。

    Expires

    将资源的实效日期告知客户端。

    Last-Modified

    指明资源最终修改的时间。

    为Cookie服务的首部字段

    Cookie的工作机制是用户识别和状态管理。当服务端开始准备管理客户端的状态时,会事先告知各种信息。
属性 说明
NAME=VALUE 赋予Cookie的名称及其值(必需项)
expires=DATE Cookie的有效期(若不指定则到浏览器关闭时为止,维持会话(Session)的时间段内)
path=PATH 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录)
domain=域名 作为Cookie适用对象的域名(若不指定则为创建Cookie的服务器的域名)
Secure 仅在https安全通信时才会发送Cookie
HttpOnly 加以限制,使Cookie不能被JavaScript脚本访问

告知服务器,当客户端想获得HTTP状态管理的支持时,就会在请求中包含从服务器接收到的Cookie。

其他首部字段

X-Frame-Options

属于HTTP响应首部,用于控制网站内容在其他Web站点的Frame标签的显示问题。

字段值:

  • DENY 拒绝
  • SAMEORIGIN 仅同源域名下的页面匹配时许可

    X-XSS-Protection

    属于HTTP响应首部,用于控制浏览器XSS防护机制的开关。
    字段值:
  • 0 将XSS过滤设置为无效状态
  • 1 将XSS过滤设置为有效状态

    DNT

    属于HTTP请求首部,全称为Do not Track,意味拒绝个人信息被收集,是表示拒绝精准广告定位的一种方法。
  • 0 同意被追踪
  • 1 拒绝被追踪

    P3P

    属于HTTP响应首部,利用P3P技术,让Web网站上的个人隐私变成一种仅供程序可理解的形式,已达到保护用户隐私的目的。