HTTP 头部字段介绍


Author: yifei / Created: May 29, 2017, 11:05 p.m. / Modified: May 29, 2017, 11:07 p.m. / Edit

HTTP 头部字段可以分为几类:

  1. 通用头部,请求和响应中都可以使用
  2. 请求头部,在请求中使用的 header
  3. 响应头部,在响应中使用的 header
  4. 实体头部,关于 body 的 header

还可以按照代理服务器如何处理分为两类

  1. end to end 的头部,代理服务器不应该修改,应该原样传递
  2. hop by hop 的头部,也就是只在两个代理服务器之间,不能向下传递。

授权

WWW-Authenticate

用于服务器说明需要的认证信息,一般和 401 一起返回

WWW-Authenticate: <type> realm=<realm>

例子:

WWW-Authenticate: Basic

WWW-Authenticate: Basic realm="Access to the staging site", charset="UTF-8"

Authorization

用于发送客户端的认证信息,可以直接发送或者用于响应 401

Authorization: <type> <credentials>

例子:

Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l

常用的 basic auth 的密钥是 base64('user:pass')

Proxy-Authenticate/Proxy-Authorization

这两个 header 类似上面两个 header,但是适用于代理服务器验证的。

缓存

Age

响应 header,网页生成的时间,用秒来表示

Cache-Control

先跳过

Clear-Site-Data

响应 header,用来清空站点在浏览器储存的数据,但是还没有被广泛支持

Expires

响应 header,指定了文档的过期时间。一般来说,为了达到既定的缓存目的,这个头部要和 Last-Modified 或者 Etag 一起使用。

Expires: <http-date>

例子

Expires: Wed, 21 Oct 2015 07:28:00 GMT

Pragma

这个是一个 http/1.0 里面的头部,一般来说,在 http/1.1 不需要这个头部,现在有意义的值只有一个,Pragma: no-cache,用于请求中指定不要从缓存中读取。

其他的缓存相关的头部,比如 Last-Modified, Etag 等等,参考这篇文章

连接管理

Connection

有两个值:keep-aliveclose

默认情况下,在 http/1.1, connection 就是持久化的。还可以使用 Keep-Alive 来制定一个过期时间,不过很少见。

可以使用 Connection: close 显式关闭一个链接。

内容协商

Content-Encoding

Browser sends Accept-Encoding header to tell the server which encoding it can understand. Server responses with Content-Encoding it choose from the Accept-Encoding.

The Accept-Encoding can be a list of methods with q saying their favorite rate.

The legal methods are:

  1. indentity
  2. gzip
  3. compress
  4. deflate
  5. br
<- Accept-Encoding: gzip; q=0.9, deflate; q=0.8
-> Content-Encoding: gzip

Browsers and the requests lib will do this automatically, but not urllib2

see also: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding

Transfer-Endcoding

transfer encoding is used to streaming http response, Otherwise, the server has to generate the whole response, and then serve it.

-> Transfer-Encoding: chunked

5\r\n
12345\r\n
a\r\n
0123456789\r\n
<number>\r\n
0xnumber bytes\r\n
0\r\n
\r\n

Note, the length of bytes is in hex number format. the last chunk has to be 0, which means the end of chunks.

if the server does not use 0\r\n\r\n to end the transmission. requests will raise an Exception[2]

See also:

[1] https://imququ.com/post/transfer-encoding-header-in-http.html [2] http://blog.csdn.net/wangzuxi/article/details/40377467


有任何问题可以发邮件到 kongyifei (at) gmail.com 讨论