HTTP头部详解:从基础到实战
HTTP(HyperText Transfer Protocol)作为Web的核心通信协议,其头部(HTTP Headers)是请求和响应中传递附加信息的关键载体。无论是前端性能优化、后端接口设计,还是网络安全防护,HTTP头部都扮演着重要角色。本文将从基础分类到实战细节,全面解析HTTP头部的核心知识。
一、HTTP头部的基础概念
HTTP头部是请求(Request)或响应(Response)消息中,除消息体(Body)外的键值对信息,格式为 Header-Name: Value
(注意冒号后有空格)。其核心作用是:
关键特性:
- 大小写不敏感(
User-Agent
与user-agent
等价) - 可重复(如
Set-Cookie
可携带多个Cookie) - 可扩展(支持自定义头部,需避免与标准冲突)
二、HTTP头部的四大分类
根据用途,HTTP头部可分为四类:通用头部(请求/响应均可用)、请求头部(仅请求)、响应头部(仅响应)、实体头部(描述消息体)。
2.1 通用头部(General Headers)
通用头部描述消息的基础属性,适用于请求和响应。
Date
Date: Sun, 25 May 2025 12:00:00 GMT
用于日志分析或时间敏感的业务逻辑。
Connection
keep-alive
)或关闭(close
)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
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)
格式:
浏览器/版本 (操作系统) 引擎/版本
服务器可根据此值返回适配内容(如移动端页面),但不可完全信任(可被伪造)。
Accept
Accept: text/html, application/json
支持权重(q值):
Accept: text/html;q=0.9,application/json;q=0.8
通配符:
image/*
表示所有图片类型,*/*
表示任意类型。Host
Host: www.example.com:8080
多域名共享IP时(虚拟主机),服务器通过此头部区分目标。
若缺失,服务器返回
400 Bad Request
。Cookie
Set-Cookie
写入)Cookie: sessionid=abc123; user=doubao
通常用于维持用户会话(需配合HTTPS防泄露)。
格式:
name=value; name2=value2
,多个Cookie用分号分隔。Authorization
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 Failed
。If-Match
ETag
与指定值匹配时执行操作(如 PUT
更新)If-Match: \"33a64df5-584\"
避免并发修改导致数据覆盖(类似乐观锁)。
若不匹配,返回
412 Precondition Failed
。Referer
Referer: https://www.example.com/search
用于统计来源、防盗链(如图片服务器验证Referer是否来自授权域名)。
隐私敏感场景可使用
Referrer-Policy
控制其传递规则(如 strict-origin-when-cross-origin
)。2.3 响应头部(Response Headers)
服务器返回响应时携带,描述服务器状态或控制客户端行为。
2.3.1 核心响应头部
Server
Server: Nginx/1.24.0
暴露版本可能带来安全风险(生产环境建议隐藏)。
可通过配置移除或伪装(如
Server: Web Server
)。Set-Cookie
Set-Cookie: sessionid=abc123; Max-Age=3600; Path=/; HttpOnly; Secure
HttpOnly
防止XSS窃取,Secure
仅HTTPS传输,SameSite=Strict
防CSRF。Location
Location: https://www.example.com/new-page
客户端自动跳转至该地址。
301(永久重定向)缓存,302(临时重定向)不缓存,307/308保持请求方法。
Access-Control-Allow-Origin
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
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
Content-Security-Policy: default-src \'self\'; script-src \'self\' https://cdn.example.com
允许加载同源资源和指定CDN的脚本。
report-uri
可收集违规报告。2.4 实体头部(Entity Headers)
描述消息体的具体内容(如大小、编码、类型),请求和响应中均可能出现。
Content-Type
Content-Type: text/html; charset=utf-8
常见类型:
application/json
、image/png
、multipart/form-data
。子类型:
application/vnd.api+json
(JSON API规范)。Content-Length
chunked
编码时无此头部)Content-Length: 1024
若与实际长度不符,可能导致客户端解析错误。
分块传输(
Transfer-Encoding: chunked
)时使用动态长度。Content-Encoding
gzip
、deflate
)Content-Encoding: gzip
客户端需先解压再解析内容。
常见编码:
br
(Brotli)、gzip
、deflate
,客户端通过 Accept-Encoding
声明支持的编码。Content-Disposition
Content-Disposition: attachment; filename=\"report.pdf\"
客户端会提示下载文件
report.pdf
。内联显示:
Content-Disposition: inline
(默认值)。Expires
Cache-Control
)Expires: 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
X-Request-ID: 12345abc
X-Forwarded-For
客户端IP, 代理1IP, 代理2IP
)X-Forwarded-For: 192.168.1.1
X-Content-Type-Options
nosniff
时强制按 Content-Type
解析)X-Content-Type-Options: nosniff
X-Frame-Options
DENY
禁止所有嵌入,SAMEORIGIN
仅同源)X-Frame-Options: SAMEORIGIN
3.2 常见头部问题
- 缓存失效:若
Cache-Control
与Expires
同时存在,Cache-Control
优先级更高; - 跨域失败:
Access-Control-Allow-Origin
需明确指定源(如https://www.example.com
),*
可能引发安全风险; - Cookie泄露:未设置
HttpOnly
的Cookie可能被JavaScript读取(XSS攻击风险); - 头部注入:未过滤的用户输入写入头部(如
User-Agent
)可能导致安全漏洞(需转义特殊字符); - 重定向循环:
Location
指向自身或形成循环路径,导致浏览器崩溃; - 压缩冲突:若客户端未发送
Accept-Encoding
,服务器不应返回Content-Encoding
; - Referer隐私问题:跨域请求时,
Referer
可能泄露用户访问历史。可通过Referrer-Policy
响应头部控制:no-referrer
:完全不发送 Referersame-origin
:仅同源请求发送 Refererstrict-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协议的“元数据核心”,掌握其用途能帮助开发者:
- 优化性能(合理设置缓存头部);
- 解决网络问题(如跨域、下载异常);
- 增强安全性(通过
STS
、CSP
等头部防护); - 实现复杂功能(如断点续传、多语言支持)。
实际开发中,建议结合抓包工具(如Chrome DevTools的Network面板)观察头部传递,加深理解。
六、HTTP头部检查清单(开发指南)
-
性能优化
- 静态资源设置
Cache-Control: max-age=31536000
(1年) - 动态资源使用
ETag
和Last-Modified
验证 - 启用
Content-Encoding: gzip
或br
压缩
- 静态资源设置
-
安全加固
- 所有Cookie设置
HttpOnly
和Secure
- 添加
Strict-Transport-Security
头部 - 配置
Content-Security-Policy
防止XSS - 隐藏
Server
版本信息 - 设置合理的
Referrer-Policy
保护用户隐私
- 所有Cookie设置
-
跨域处理
- 精确设置
Access-Control-Allow-Origin
- 对预检请求设置
Access-Control-Max-Age
- 允许必要的自定义头部(如
Access-Control-Allow-Headers
)
- 精确设置
-
用户体验
- 文件下载设置
Content-Disposition
- 多语言响应添加
Content-Language
- 长连接使用
Connection: keep-alive
- 文件下载设置
-
监控与调试
- 添加自定义请求ID(如
X-Request-ID
) - 使用
Vary
头部正确处理缓存变体 - 分析响应时间(如添加
X-Response-Time
)
- 添加自定义请求ID(如