HTTP 头部

头部(Header)是 HTTP 报文里信息量最大的部分——起始行只说"做什么","谁在做、怎么做、做的是什么类型、要怎么处理"几乎全靠头部说明。这一章把常用头分类讲清。

1. 头部的格式

头部位于起始行之后、空行之前,每行一个:

2. 四大类

头部按用途分四类(HTTP/1.1 起这个分类已淡化,但记忆起来方便):

3. 通用头

# 通用头 (请求和响应都能出现)
Cache-Control: no-cache              # 缓存策略
Connection: keep-alive               # 保持 TCP 连接
Date: Tue, 05 Aug 2026 08:30:00 GMT  # 报文时间
Transfer-Encoding: chunked           # 传输编码 (分块)

4. 请求头(最重要)

# 常用请求头
Host: api.example.com                # 必填!目标主机 (虚拟主机靠它区分)
User-Agent: Mozilla/5.0 (...)        # 客户端身份 (浏览器/设备/curl)
Accept: application/json             # 想要什么类型
Accept-Language: zh-CN,zh;q=0.9      # 想要什么语言
Accept-Encoding: gzip, br            # 接受什么压缩算法
Authorization: Bearer <token>        # 认证凭证
Cookie: sessionid=abc123             # 携带的 Cookie
Referer: https://www.example.com/    # 从哪个页面跳来的
Origin: https://www.example.com      # 来源 (CORS 用)
Content-Type: application/json       # 请求体类型 (有 body 时必填)
Content-Length: 36                   # 请求体字节数
If-None-Match: "abc"                 # 缓存校验 (配合 304)

几个高频点:

5. 响应头

# 常用响应头
Server: nginx/1.25.0                 # 服务器软件 (生产建议隐藏,防指纹)
Date: Tue, 05 Aug 2026 08:30:00 GMT  # 响应时间
Content-Type: application/json       # 响应体类型
Content-Length: 47                   # 响应体字节数
Content-Encoding: gzip               # 响应体已用 gzip 压缩
Cache-Control: max-age=600           # 浏览器可缓存 600 秒
ETag: "abc123"                       # 资源指纹 (配合 304)
Last-Modified: Mon, 04 Aug 2025 ...  # 最后修改时间
Location: /users/42                  # 重定向目标 (3xx) 或新建资源 URL (201)
Set-Cookie: sessionid=xyz; HttpOnly  # 让浏览器存 Cookie
WWW-Authenticate: Bearer             # 401 时告诉客户端怎么认证
Access-Control-Allow-Origin: *       # CORS 允许跨域

几个高频点:

6. Authorization:认证凭证

# Authorization 头几种常见方案
Authorization: Basic dXNlcjpwYXNz     # Basic Auth (user:pass 的 Base64)
Authorization: Bearer eyJhbGciOi...   # JWT Token (OAuth2 常用)
Authorization: ApiKey abc123          # API Key (各 RPC 框架自定义)

# 警告: Basic Auth 的 Base64 不是加密!抓包就能解出明文密码,
# 必须配合 HTTPS 使用

实战中 90% 的现代 API 用 Bearer Token(JWT 是其常见格式)。

7. 缓存头:Cache-Control

这是性能优化里最重要的头。和 ETagLast-ModifiedIf-None-MatchIf-Modified-Since 配合工作。

# Cache-Control 是 HTTP/1.1 缓存指令,功能最强
Cache-Control: max-age=600           # 浏览器/CDN 缓存 600 秒
Cache-Control: no-cache              # 每次都要去服务器问"变没变" (可 304)
Cache-Control: no-store              # 绝对不缓存 (敏感数据/银行)
Cache-Control: public                # 浏览器和 CDN 都能缓存
Cache-Control: private               # 只让浏览器缓存,CDN 不许
Cache-Control: immutable             # 永远不会变,过期前都不用问

# 配合 ETag / If-None-Match 实现 304:
# 响应: ETag: "abc123"
# 下次请求: If-None-Match: "abc123"
# 服务器没变就回 304,变了回 200 + 新 body

8. CORS 头:跨域必备

浏览器同源策略默认禁止跨域请求(协议/域名/端口任一不同即跨域)。CORS(跨源资源共享)通过一组头让服务器显式允许:

# CORS 跨域相关头 (浏览器才有, curl 不受 CORS 限制)
# 请求方 (浏览器自动加):
Origin: https://www.example.com

# 响应方 (服务器必须显式允许):
Access-Control-Allow-Origin: https://www.example.com  # 允许这个域名
Access-Control-Allow-Origin: *                        # 允许任何域名 (公开 API)
Access-Control-Allow-Methods: GET, POST, PUT, DELETE  # 允许的方法
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true                # 允许带 Cookie
Access-Control-Max-Age: 86400                         # 预检结果缓存 1 天

注意:

9. 自定义头

# 自定义头: 通常加 X- 前缀 (历史惯例,新规范不再强制)
X-Request-Id: 9f3a2b1c-...           # 链路追踪 ID
X-RateLimit-Limit: 100               # 限流配额
X-RateLimit-Remaining: 87
X-Forwarded-For: 1.2.3.4             # 反向代理记录真实客户端 IP
X-Forwarded-Proto: https             # 反代记录原始协议

# 现代风格:直接用业务名,不加 X- (例如 Github-API 把版本写在头里)
Github-Version: 2022-11-28

命名约定(RFC 6648 之后不再强制):

10. 反向代理常用头

Nginx/CDN/负载均衡器会注入这些头给后端,让后端知道真实客户端信息:

注意:客户端可以伪造这些头!后端取信任 IP 时一定要确认"上一跳是不是可信代理"。

11. 安全相关头(运维加,开发者了解)

小结

记住几个高频头就够日常用了:Host Content-Type Content-Length Authorization Cache-Control User-Agent Accept Cookie Set-Cookie Location ETag。CORS 头是前后端分离的必修内容。

← 上一篇 HTTP 状态码

下一篇 请求体与 Content-Type

✈️💬