HTTP 首部字段

HTTP 首部字段用于描述报文。

首部字段的格式特点:

  1. 字段名 不区分大小写
  2. 字段名不允许出现空格,不可以出现下划线 _
  3. 字段名后必须紧跟着冒号 :

报文信息

以下报文形式 通用 表示请求头和响应头均可使用。

报文形式首部字段名说明示例
通用Date创建报文的日期时间Date: Tue, 15 Nov 2010 08:12:31 GMT
请求头Origin请求页面的站点地址Origin: https://developer.mozilla.org
Referer请求页面的完整 URL 地址Referer: https://developer.mozilla.org/en-US/docs/Web/JavaScript
Host请求要发送到的资源服务器的主机名和端口号Host: www.taobao.com
User-Agent用户代理软件的应用类型、操作系统、软件开发商以及版本号User-Agent: Mozilla/5.0 (Linux; X11)

网络连接

报文形式首部字段名说明示例
通用Keep-Alive允许消息发送者表示连接的状态,还可以用于设置超时时长和最大请求数
Connection决定当前事务完成后,是否会关闭网络连接Connection: close

Connection

如果取值为 keep-alive,网络连接就是持久的,不会关闭,使用对同一服务器的请求可以继续在该连接上完成。

可取值:

  • keep-alive:表明客户端想要保持该网络连接打开,HTTP/1.1 的请求默认使用一个持久连接。这个请求头列表由头部名组成,这些头将被第一个非透明的代理或者代理间的缓存所移除:这些头定义了发出者和第一个实体之间的连接,而不是和目的地节点间的连接。
  • close:表明客户端或服务器想要关闭该网络连接,这是 HTTP/1.0 请求的默认值

Keep-Alive

Keep-Alive 是一个通用消息头,允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数。

语法:

Keep-Alive: parameters

一系列用逗号隔开的参数,每一个参数由一个标识符和一个值构成,并使用等号 = 隔开。下述标识符是可用的:

  • timeout:指定空闲连接需要保持打开状态的最小时长(以秒为单位)。需要注意的是,如果没有在传输层设置 keep-alive TCP message 的话,大于 TCP 层面的超时设置会被忽略。
  • max:在连接关闭之前,在此连接可以发送的请求的最大值。在非管道连接中,除了 0 以外,这个值是被忽略的,因为需要在紧跟着的响应中发送新一次的请求。HTTP 管道连接则可以用它来限制管道的使用。

使用示例:

HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Thu, 11 Aug 2016 15:23:13 GMT
Keep-Alive: timeout=5, max=1000
Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT
Server: Apache

HTTP 请求启动 KeepAlive 需要服务端配合,Nginx 配置:

http {
# 客户端连接在服务器端保持开启的超时值
keepalive_timeout 120s 120s;
# 可以服务的请求的最大数量
keepalive_requests 10000;
}

内容协商

报文形式首部字段名说明示例
请求头Accept用于告知服务器客户端可处理的 媒体类型Accept: text/plain, text/html
Accept-Charset用于告知服务器客户端可处理的 字符集类型Accept-Charset: utf-8, iso-8859-5
Accept-Encoding用于告知服务器客户端可处理的 内容编码方式Accept-Encoding: gzip, deflate, br
Accept-Language用于告知服务器客户端可处理的 自然语言Accept-Language: en,zh
响应头Content-Type用于指示资源的 媒体类型(MIME 类型)Content-Type: text/html; charset=utf-8
Content-Encoding用于指示资源的 编码方式Content-Encoding: gzip
Content-Language用于指示资源的 自然语言Content-Language: en,zh
Content-Length用于指示资源的 体积大小(单位:字节)Content-Length: 348
Content-Location用于指示要访问的资源通过内容协商后的 URLContent-Location: /index.htm
Content-Range表示数据片段在整个文件中的位置Content-Range: bytes 21010-47021/47022

压缩方式

当然一般这些数据都是会进行编码压缩的,采取什么样的压缩方式就体现在了发送方的 Content-Encoding 字段上, 同样的,接收什么样的压缩方式体现在了接受方的 Accept-Encoding 字段上。这个字段的取值有下面几种:

  • gzip:当今最流行的压缩格式
  • deflate:另外一种著名的压缩格式
  • br:一种专门为 HTTP 发明的压缩算法
<!-- 发送端 -->
Content-Encoding: gzip;
<!-- 接收端 -->
Accept-Encoding: gzip

Content-Type

在响应中,Content-Type 用于告知客户端实际返回的内容的内容类型。

指令:

  • media-type:资源或数据的 MIME 类型
  • charset:字符编码标准
  • boundary:用于封装消息的多个部分的边界

同源策略

报文形式首部字段名说明示例
请求头Access-Control-Request-Headers(预检请求)列出正式请求中允许的首部信息Access-Control-Request-Headers: *
Access-Control-Request-Method(预检请求)列出正式请求中允许的请求方法Access-Control-Request-Method: *
响应头Access-Control-Allow-Credentials表示是否可以将对请求的响应暴露给页面Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers(预检请求)列出正式请求中允许的首部信息Access-Control-Allow-Headers: *
Access-Control-Allow-Methods(预检请求)列出正式请求中允许的请求方法Access-Control-Allow-Methods: *
Access-Control-Allow-Origin(预检请求)列出正式请求中允许的域名Access-Control-Allow-Origin: https://developer.mozilla.org
Access-Control-Expose-Headers(预检请求)列出正式请求中哪些首部可以暴露Access-Control-Expose-Headers: Content-Length, X-Kuma-Revision
Access-Control-Max-Age(预检请求)列出正式请求中 Access-Control-Allow-HeadersAccess-Control-Allow-Methods 缓存时间Access-Control-Max-Age: 600

缓存协商

报文形式首部字段名说明示例
通用Cache-Control表示资源的缓存策略Cache-Control: no-cache
请求头If-Modified-Since比较资源的更新时间If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
If-Match比较实体标记(ETag)If-Match: “737060cd8c284d8af7aD3082f209582d”
If-None-Match比较实体标记(与 If-Match 相反)If-None-Match: “737060cd8c284d8af7ad3082f209582d”
If-Range资源未更新时发送实体 Byte 的范围请求If-Range: “737060cd8c284d8af7ad3082f209582d”
If-Unmodified-Since比较资源的更新时间(与 If-Modified-Since 相反)If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
响应头Expires表示资源的过期时间Expires: Thu, 01 Dec 2010 16:00:00 GMT
Last-Modified表示服务器认定资源最后的修改时间Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT
ETag请求变量的实体标签的当前值ETag: “737060cd8c284d8af7ad3082f209582d”

权限认证

报文形式首部字段名说明示例
通用Via代理服务器的相关信息Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
请求头Authorization用于验证用户代理身份的凭证Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Proxy-Authorization代理服务器对客户端的认证信息Proxy-Authenticate: Basic realm="Access to the internal site"
响应头WWW-Authenticate服务器对客户端的认证信息WWW-Authenticate: Basic
Proxy-Authenticate用于指定代理服务器上的资源访问权限而采用的身份验证方式Proxy-Authenticate: Basic realm="Access to the internal site"

其他

首部字段名说明示例
Allow资源可支持的 HTTP 方法Allow: GET,HEAD
Trailer报文末端的首部一览Trailer: Max-Forwards
Transfer-Encoding指定报文主题的传输编码方式Transfer-Encoding:chunked
Location用来重定向接收方到非请求 URL 的位置来完成请求或标识新的资源Location: http://www.leixuesong.cn/724
Retry-After如果实体暂时不可取,通知客户端在指定时间之后再次尝试Retry-After: 120
ServerWeb 服务器的安装信息Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)

参考资料