Skip to content

HTTP 首部字段传递重要信息

HTTP 首部字段是构成 HTTP 报文的要素之一。在客户端与服务器之间以 HTTP 协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。

使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。

img

图:首部字段内可使用的附加信息较多

HTTP 首部字段结构

HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:”分隔。

http
首部字段名: 字段值

例如,在 HTTP 首部中以 Content-Type 这个字段来表示报文主体的对象类型。

http
Content-Type: text/html

就以上述示例来看,首部字段名为 Content-Type,字符串 text/html 是字段值。

另外,字段值对应单个 HTTP 首部字段可以有多个值,如下所示。

http
Keep-Alive: timeout=5, max=100

若 HTTP 首部字段重复了会如何?

当 HTTP 报文首部中出现了两个或两个以上具有相同首部字段名时会怎么样?这种情况在规范内尚未明确,根据浏览器内部处理逻辑的不同,结果可能并不一致。有些浏览器会优先处理第一次出现的首部字段,而有些则会优先处理最后出现的首部字段。

4 种 HTTP 首部字段类型

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

  • 通用首部字段(General Header Fields):请求报文和响应报文两方都会使用的首部。

  • 请求首部字段(Request Header Fields):从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。

  • 响应首部字段(Response Header Fields):从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。

  • 实体首部字段(Entity Header Fields):针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。

HTTP/1.1 首部字段一览

HTTP/1.1 规范定义了如下 47 种首部字段。

表:通用首部字段

首部字段名说明举例(含义)
Cache-Control控制缓存的行为Cache-Control: no-cache (不使用缓存,每次都向服务器请求最新内容)
Connection逐跳首部、连接的管理Connection: keep-alive (保持连接以复用 TCP 连接)
Date创建报文的日期时间Date: Wed, 21 Oct 2015 07:28:00 GMT (报文创建的日期和时间)
Pragma报文指令Pragma: no-cache (HTTP/1.0 用于禁止缓存的旧字段)
Trailer报文末端的首部一览Trailer: Expires (分块传输时,尾部字段包含 Expires 信息)
Transfer-Encoding指定报文主体的传输编码方式Transfer-Encoding: chunked (分块传输编码)
Upgrade升级为其他协议Upgrade: websocket (将协议升级为 WebSocket)
Via代理服务器的相关信息Via: 1.0 fred, 1.1 example.com (显示经过的代理服务器信息)
Warning错误通知Warning: 199 Miscellaneous warning (警告,提示存在非关键问题)

表:请求首部字段

首部字段名说明举例(含义)
Accept用户代理可处理的媒体类型Accept: text/html (客户端期望接收 HTML 格式数据)
Accept-Charset优先的字符集Accept-Charset: utf-8 (客户端希望接收 UTF-8 编码内容)
Accept-Encoding优先的内容编码Accept-Encoding: gzip, deflate (支持 gzip 或 deflate 压缩)
Accept-Language优先的语言(自然语言)Accept-Language: zh-CN, en-US (客户端首选中文,其次英文)
AuthorizationWeb认证信息Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== (HTTP 基础认证)
Expect期待服务器的特定行为Expect: 100-continue (期望服务器确认后再发送请求体)
From用户的电子邮箱地址From: user@example.com (标识用户身份的邮箱)
Host请求资源所在服务器Host: www.example.com (指定请求的目标主机)
If-Match比较实体标记(ETag)If-Match: "xyz" (只有资源匹配 ETag 时才执行操作)
If-Modified-Since比较资源的更新时间If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT (资源自此时间后更新才返回)
If-None-Match比较实体标记(与 If-Match 相反)If-None-Match: "xyz" (只有资源 ETag 不匹配才返回)
If-Range资源未更新时发送实体 Byte 范围请求If-Range: "xyz" (只有资源未更新才返回部分数据)
If-Unmodified-Since比较资源的更新时间(与 If-Modified-Since 相反)If-Unmodified-Since: Wed, 21 Oct 2015 07:28:00 GMT (资源未更新才继续)
Max-Forwards最大传输跳数Max-Forwards: 10 (TRACE 或 OPTIONS 请求的最大转发次数)
Proxy-Authorization代理服务器要求客户端的认证信息Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range实体的字节范围请求Range: bytes=500-999 (请求资源的第 500 到 999 字节)
Referer对请求中 URI 的原始获取方Referer: https://google.com (请求来源页面)
TE传输编码的优先级TE: gzip (表示支持 gzip 传输编码)
User-AgentHTTP 客户端程序的信息User-Agent: Mozilla/5.0 ... (标识浏览器或客户端信息)

表:响应首部字段

首部字段名说明举例(含义)
Accept-Ranges是否接受字节范围请求Accept-Ranges: bytes (服务器接受字节范围请求,客户端可以进行范围下载或断点续传)
Age推算资源创建经过时间Age: 3600 (资源在缓存中存储了 3600 秒,即 1 小时)
ETag资源的匹配信息ETag: "abcde-12345" (资源的唯一标识符,用于缓存验证)
Location令客户端重定向至指定 URILocation: http://www.example.com/new_page (指示客户端重定向到新的 URL)
Proxy-Authenticate代理服务器对客户端的认证信息Proxy-Authenticate: Basic realm="Protected Area" (代理服务器要求客户端进行身份认证)
Retry-After对再次发起请求的时机要求Retry-After: 120 (客户端应在 120 秒后再次尝试请求) 或 Retry-After: Fri, 26 Jul 2025 05:00:00 GMT (客户端应在指定日期时间后再次尝试请求)
ServerHTTP 服务器的安装信息Server: Apache/2.4.41 (Unix) (表明服务器是 Apache 版本 2.4.41,运行在 Unix 系统上)
Vary代理服务器缓存的管理信息Vary: Accept-Encoding (指示代理服务器,根据请求的 Accept-Encoding 头部来缓存不同版本的资源)
WWW-Authenticate服务器对客户端的认证信息WWW-Authenticate: Basic realm="Secure Area" (服务器要求客户端进行身份认证)

表:实体首部字段

首部字段名说明举例(含义)
Allow资源可支持的 HTTP 方法Allow: GET, HEAD, PUT (指示资源支持 GET、HEAD 和 PUT 方法)
Content-Encoding实体主体适用的编码方式Content-Encoding: gzip (表示实体主体使用 gzip 压缩)
Content-Language实体主体的自然语言Content-Language: en-US (表示实体主体内容是美式英语)
Content-Length实体主体的大小(单位:字节)Content-Length: 1234 (表示实体主体的长度是 1234 字节)
Content-Location替代对应资源的 URIContent-Location: /index.en.html (指定了该资源的一个替代位置,例如英文版)
Content-MD5实体主体的报文摘要Content-MD5: d87019c001fef45a8f4c28d2232921a9 (实体主体的 MD5 校验和,用于内容完整性检查)
Content-Range实体主体的位置范围Content-Range: bytes 0-499/1000 (表示当前实体包含总共 1000 字节的资源中的第 0 到 499 字节)
Content-Type实体主体的媒体类型Content-Type: text/html; charset=UTF-8 (表示实体主体是 UTF-8 编码的 HTML 文本)
Expires实体主体过期的日期时间Expires: Fri, 25 Jul 2025 17:00:00 GMT (表示实体主体在指定的日期和时间过期)
Last-Modified资源的最后修改日期时间Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT (表示资源的最后修改时间)

非 HTTP/1.1 首部字段

在 HTTP 协议通信交互中使用到的首部字段,不限于 RFC2616 中定义的 47 种首部字段。还有 Cookie、Set-Cookie 和 Content-Disposition 等在其他 RFC 中定义的首部字段,它们的使用频率也很高。

这些非正式的首部字段统一归纳在 RFC4229 HTTPHeader Field Registrations 中。

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

HTTP 首部字段将定义成缓存代理和非缓存代理的行为,分成 2 种类型。

  • 端到端首部(End-to-end Header):分在此类别中的首部会转发给请求/响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。

  • 逐跳首部(Hop-by-hop Header):分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1 和之后版本中,如果要使用 hop-by-hop 首部,需提供 Connection 首部字段。

下面列举了 HTTP/1.1 中的逐跳首部字段。除这 8 个首部字段之外,其他所有字段都属于端到端首部。

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • Trailer
  • TE
  • Transfer-Encoding
  • Upgrade

如有转载或CV请标注本站原文地址