> 技术文档 > HTTP头部详解:从基础到实战

HTTP头部详解:从基础到实战

HTTP(HyperText Transfer Protocol)作为Web的核心通信协议,其头部(HTTP Headers)是请求和响应中传递附加信息的关键载体。无论是前端性能优化、后端接口设计,还是网络安全防护,HTTP头部都扮演着重要角色。本文将从基础分类到实战细节,全面解析HTTP头部的核心知识。

一、HTTP头部的基础概念

HTTP头部是请求(Request)或响应(Response)消息中,除消息体(Body)外的键值对信息,格式为 Header-Name: Value(注意冒号后有空格)。其核心作用是:

  • 描述消息元数据(如时间、编码、大小)
  • 控制客户端/服务器行为(如缓存、重定向)
  • 传递上下文信息(如身份认证、Cookie)
  • 协商内容格式(如语言、类型、压缩方式)

关键特性

  • 大小写不敏感(User-Agentuser-agent 等价)
  • 可重复(如 Set-Cookie 可携带多个Cookie)
  • 可扩展(支持自定义头部,需避免与标准冲突)

二、HTTP头部的四大分类

根据用途,HTTP头部可分为四类:通用头部(请求/响应均可用)、请求头部(仅请求)、响应头部(仅响应)、实体头部(描述消息体)。

2.1 通用头部(General Headers)

通用头部描述消息的基础属性,适用于请求和响应。

字段名 作用 示例与细节 Date 消息生成的服务器时间(GMT格式) Date: Sun, 25 May 2025 12:00:00 GMT
用于日志分析或时间敏感的业务逻辑。 Connection 控制连接持久化(keep-alive)或关闭(close) HTTP/1.1默认开启长连接(keep-alive),减少TCP握手开销。
HTTP/2及HTTP/3使用二进制分帧,默认支持多路复用,无需显式设置。 Cache-Control 定义缓存策略(核心字段) Cache-Control: max-age=3600(缓存1小时)
no-cache(强制验证缓存)
private(仅客户端缓存)
must-revalidate(缓存过期前必须验证)。 Transfer-Encoding 消息体编码方式(如分块传输 chunked) 仅当 Content-Length 未知时使用(如流式响应),分块传输无固定长度。
格式:每个数据块前包含块大小(十六进制),最后以0\\r\\n\\r\\n结束。

2.2 请求头部(Request Headers)

客户端发送请求时携带,描述客户端需求或上下文。

2.2.1 核心请求头部
字段名 作用 示例与细节 User-Agent 标识客户端类型(浏览器、APP、爬虫等) User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)
格式:浏览器/版本 (操作系统) 引擎/版本
服务器可根据此值返回适配内容(如移动端页面),但不可完全信任(可被伪造)。 Accept 声明客户端可接受的内容类型(MIME类型) Accept: text/html, application/json
支持权重(q值):Accept: text/html;q=0.9,application/json;q=0.8
通配符:image/* 表示所有图片类型,*/* 表示任意类型。 Host 目标服务器域名+端口(HTTP/1.1强制) Host: www.example.com:8080
多域名共享IP时(虚拟主机),服务器通过此头部区分目标。
若缺失,服务器返回 400 Bad RequestCookie 携带客户端存储的Cookie(由服务器通过 Set-Cookie 写入) Cookie: sessionid=abc123; user=doubao
通常用于维持用户会话(需配合HTTPS防泄露)。
格式:name=value; name2=value2,多个Cookie用分号分隔。 Authorization 身份认证信息(如Token、Basic认证) Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
常见于RESTful API的权限验证。
基本认证:Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==(Base64编码的username:password)。
2.2.2 特殊请求头部
字段名 作用 示例与细节 From 自动化客户端(如爬虫)的用户邮箱(非浏览器使用) From: crawler@example.com
服务器可通过此邮箱联系开发者,避免误封。
遵循RFC 7231规范,作为“礼貌性声明”,滥用可能导致请求被拦截。 Range 分块下载资源(断点续传关键) Range: bytes=0-499
服务器返回 206 Partial Content 时携带此头部。
多部分请求:Range: bytes=0-499,1000-1499(需配合Content-Type: multipart/byteranges)。 Expect 告知服务器客户端期望行为(如等待确认后发送大消息体) Expect: 100-continue
客户端发送 POST 前,先询问服务器是否接受,避免无效传输。
若服务器不支持,返回 417 Expectation FailedIf-Match 条件请求:仅当资源 ETag 与指定值匹配时执行操作(如 PUT 更新) If-Match: \"33a64df5-584\"
避免并发修改导致数据覆盖(类似乐观锁)。
若不匹配,返回 412 Precondition FailedReferer 指示当前请求的来源页面URL(拼写错误源于早期HTTP规范) Referer: https://www.example.com/search
用于统计来源、防盗链(如图片服务器验证Referer是否来自授权域名)。
隐私敏感场景可使用 Referrer-Policy 控制其传递规则(如 strict-origin-when-cross-origin)。

2.3 响应头部(Response Headers)

服务器返回响应时携带,描述服务器状态或控制客户端行为。

2.3.1 核心响应头部
字段名 作用 示例与细节 Server 标识服务器软件(如Nginx、Apache) Server: Nginx/1.24.0
暴露版本可能带来安全风险(生产环境建议隐藏)。
可通过配置移除或伪装(如 Server: Web Server)。 Set-Cookie 向客户端写入Cookie(可设置过期时间、作用域) Set-Cookie: sessionid=abc123; Max-Age=3600; Path=/; HttpOnly; Secure
HttpOnly 防止XSS窃取,Secure 仅HTTPS传输,SameSite=Strict 防CSRF。 Location 重定向目标URL(配合3xx状态码) Location: https://www.example.com/new-page
客户端自动跳转至该地址。
301(永久重定向)缓存,302(临时重定向)不缓存,307/308保持请求方法。 Access-Control-Allow-Origin 控制跨域资源共享(CORS) Access-Control-Allow-Origin: https://www.example.com
* 表示所有源(生产环境慎用)。
配合 Vary: Origin 避免缓存污染。
2.3.2 高级响应头部
字段名 作用 示例与细节 ETag 资源的唯一指纹(缓存验证核心) ETag: \"33a64df5-584-5d04a2eef7bc0\"
客户端通过 If-None-Match 携带此值,匹配则返回 304 Not Modified
弱验证:W/\"33a64df5-584\"(内容相同但资源不同时使用)。 Strict-Transport-Security 强制客户端使用HTTPS(防HTTP降级攻击) Strict-Transport-Security: max-age=31536000; includeSubDomains
浏览器自动将HTTP请求重定向为HTTPS,有效期1年(max-age 单位秒)。
需通过HTTPS首次访问激活。 Vary 告知缓存服务器“根据哪些请求头部区分缓存” Vary: Accept-Language
表示不同语言(如中文/英文)的请求需单独缓存。
多头部:Vary: Accept-Encoding, User-Agent(根据编码和客户端类型缓存)。 Content-Security-Policy 限制页面可加载的资源来源(防XSS) Content-Security-Policy: default-src \'self\'; script-src \'self\' https://cdn.example.com
允许加载同源资源和指定CDN的脚本。
report-uri 可收集违规报告。

2.4 实体头部(Entity Headers)

描述消息体的具体内容(如大小、编码、类型),请求和响应中均可能出现。

字段名 作用 示例与细节 Content-Type 消息体类型+编码(MIME类型) Content-Type: text/html; charset=utf-8
常见类型:application/jsonimage/pngmultipart/form-data
子类型:application/vnd.api+json(JSON API规范)。 Content-Length 消息体字节长度(chunked 编码时无此头部) Content-Length: 1024
若与实际长度不符,可能导致客户端解析错误。
分块传输(Transfer-Encoding: chunked)时使用动态长度。 Content-Encoding 消息体压缩方式(如gzipdeflateContent-Encoding: gzip
客户端需先解压再解析内容。
常见编码:br(Brotli)、gzipdeflate,客户端通过 Accept-Encoding 声明支持的编码。 Content-Disposition 控制消息体展示方式(内联或下载) Content-Disposition: attachment; filename=\"report.pdf\"
客户端会提示下载文件 report.pdf
内联显示:Content-Disposition: inline(默认值)。 Expires 资源的过期时间(缓存控制,优先级低于 Cache-ControlExpires: Sun, 25 May 2025 14:00:00 GMT
Cache-Control 包含 max-age,则 Expires 被忽略。
已过时,推荐使用 Cache-Control

三、自定义头部与常见问题

3.1 自定义头部规范

除标准头部外,开发者可自定义头部传递业务信息。注意事项

  • 避免使用 X- 前缀(RFC 6648已不推荐,可能与未来标准冲突);
  • 推荐使用 业务-字段 格式(如 App-Version: 1.0.0);
  • 敏感信息(如用户ID)禁止通过自定义头部传输(优先用Authorization);
  • 服务器需过滤未知头部,防止头注入攻击(如 X-HTTP-Method-Override 篡改请求方法)。
常见自定义头部示例:
字段名 作用 示例 X-Request-ID 追踪请求链路(分布式系统中标记唯一请求 ID) X-Request-ID: 12345abc X-Forwarded-For 代理服务器传递客户端真实 IP(格式:客户端IP, 代理1IP, 代理2IPX-Forwarded-For: 192.168.1.1 X-Content-Type-Options 防止浏览器 MIME 类型嗅探(值为 nosniff 时强制按 Content-Type 解析) X-Content-Type-Options: nosniff X-Frame-Options 控制页面能否被嵌入 iframe(DENY 禁止所有嵌入,SAMEORIGIN 仅同源) X-Frame-Options: SAMEORIGIN

3.2 常见头部问题

  1. 缓存失效:若 Cache-ControlExpires 同时存在,Cache-Control 优先级更高;
  2. 跨域失败Access-Control-Allow-Origin 需明确指定源(如 https://www.example.com),* 可能引发安全风险;
  3. Cookie泄露:未设置 HttpOnly 的Cookie可能被JavaScript读取(XSS攻击风险);
  4. 头部注入:未过滤的用户输入写入头部(如User-Agent)可能导致安全漏洞(需转义特殊字符);
  5. 重定向循环Location 指向自身或形成循环路径,导致浏览器崩溃;
  6. 压缩冲突:若客户端未发送 Accept-Encoding,服务器不应返回 Content-Encoding
  7. Referer隐私问题:跨域请求时,Referer 可能泄露用户访问历史。可通过 Referrer-Policy 响应头部控制:
    • no-referrer:完全不发送 Referer
    • same-origin:仅同源请求发送 Referer
    • strict-origin-when-cross-origin:跨域时只发送源(如 https://example.com)

四、实战:典型场景下的头部应用

4.1 缓存优化(客户端-服务器协作)# 请求头部(客户端验证缓存)

If-None-Match: “33a64df5-584-5d04a2eef7bc0” # 上次响应的ETag
If-Modified-Since: Sun, 25 May 2025 10:00:00 GMT # 上次响应的Last-Modified

响应头部(服务器验证结果)

200 OK # 资源已修改,返回新内容

304 Not Modified # 资源未修改,客户端使用本地缓存

4.2 跨域资源共享(CORS)# 简单请求(GET、POST等)

响应头部(服务器允许特定源访问)

Access-Control-Allow-Origin: https://www.example.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type, Authorization

预检请求(复杂请求如PUT、DELETE前的OPTIONS请求)

响应头部(服务器允许特定源访问)

Access-Control-Allow-Origin: https://www.example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400 # 预检结果缓存24小时

4.3 文件下载(触发客户端保存)# 响应头部(指示客户端下载)

Content-Type: application/octet-stream
Content-Disposition: attachment; filename=“data.zip”
Content-Length: 204800 # 文件总大小(字节)
Content-Encoding: gzip # 若文件已压缩

4.4 断点续传(Range请求)# 客户端请求(续传前500字节后的内容)

Range: bytes=500-

服务器响应

206 Partial Content
Content-Range: bytes 500-204799/204800 # 已传范围/总大小
Content-Type: application/octet-stream
Content-Length: 204300 # 本次传输大小

4.5 安全防护(关键头部组合)# 响应头部(安全增强)

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload # 强制HTTPS
Content-Security-Policy: default-src ‘self’; script-src ‘self’ https://cdn.example.com # 限制资源加载
X-Content-Type-Options: nosniff # 防止MIME嗅探
X-Frame-Options: SAMEORIGIN # 禁止被其他网站iframe嵌入
X-XSS-Protection: 1; mode=block # XSS防护
Referrer-Policy: strict-origin-when-cross-origin # 控制Referer传递规则

五、总结

HTTP头部是HTTP协议的“元数据核心”,掌握其用途能帮助开发者:

  • 优化性能(合理设置缓存头部);
  • 解决网络问题(如跨域、下载异常);
  • 增强安全性(通过STSCSP等头部防护);
  • 实现复杂功能(如断点续传、多语言支持)。

实际开发中,建议结合抓包工具(如Chrome DevTools的Network面板)观察头部传递,加深理解。

六、HTTP头部检查清单(开发指南)

  1. 性能优化

    • 静态资源设置 Cache-Control: max-age=31536000(1年)
    • 动态资源使用 ETagLast-Modified 验证
    • 启用 Content-Encoding: gzipbr 压缩
  2. 安全加固

    • 所有Cookie设置 HttpOnlySecure
    • 添加 Strict-Transport-Security 头部
    • 配置 Content-Security-Policy 防止XSS
    • 隐藏 Server 版本信息
    • 设置合理的 Referrer-Policy 保护用户隐私
  3. 跨域处理

    • 精确设置 Access-Control-Allow-Origin
    • 对预检请求设置 Access-Control-Max-Age
    • 允许必要的自定义头部(如 Access-Control-Allow-Headers
  4. 用户体验

    • 文件下载设置 Content-Disposition
    • 多语言响应添加 Content-Language
    • 长连接使用 Connection: keep-alive
  5. 监控与调试

    • 添加自定义请求ID(如 X-Request-ID
    • 使用 Vary 头部正确处理缓存变体
    • 分析响应时间(如添加 X-Response-Time