HTTP 首部字段传递重要信息
HTTP 首部字段是构成 HTTP 报文的要素之一。在客户端与服务器之间以 HTTP 协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。
使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。
图:首部字段内可使用的附加信息较多
HTTP 首部字段结构
HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:”分隔。
首部字段名: 字段值
例如,在 HTTP 首部中以 Content-Type 这个字段来表示报文主体的对象类型。
Content-Type: text/html
就以上述示例来看,首部字段名为 Content-Type,字符串 text/html 是字段值。
另外,字段值对应单个 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 (客户端首选中文,其次英文) |
Authorization | Web认证信息 | 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-Agent | HTTP 客户端程序的信息 | User-Agent: Mozilla/5.0 ... (标识浏览器或客户端信息) |
表:响应首部字段
首部字段名 | 说明 | 举例(含义) |
---|---|---|
Accept-Ranges | 是否接受字节范围请求 | Accept-Ranges: bytes (服务器接受字节范围请求,客户端可以进行范围下载或断点续传) |
Age | 推算资源创建经过时间 | Age: 3600 (资源在缓存中存储了 3600 秒,即 1 小时) |
ETag | 资源的匹配信息 | ETag: "abcde-12345" (资源的唯一标识符,用于缓存验证) |
Location | 令客户端重定向至指定 URI | Location: 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 (客户端应在指定日期时间后再次尝试请求) |
Server | HTTP 服务器的安装信息 | 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 | 替代对应资源的 URI | Content-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