做接口调试、性能优化或安全配置时,HTTP 头信息是 “隐形的关键”—— 列如用Accept-Encoding启用 Gzip 压缩能减 50% 传输体积,用Cache-Control控制缓存能减少重复请求,用User-Agent适配不同客户端。但许多开发者只知道常见的Host“Cookie”,对全量 HTTP 头的作用和用法一知半解。今天整理完整 HTTP 头体系,按 “通用头(请求响应通用)→请求头(客户端发服务器)→响应头(服务器回客户端)→实体头(描述资源内容)” 分类,每个 Header 都附 “核心作用 + 示例 + 场景避坑”,文末还有 “场景速查表”,按Ctrl+F可快速定位目标 Header,收藏这篇,调试时不用再到处搜!
一、先搞懂:HTTP 头的基本规则(避免低级错误)
在看具体 Header 前,先明确 3 个通用规则,避免用错:
- 格式要求:每个 Header 由 “名称:值” 组成(冒号后必须有空格),如Accept: text/html(错误写法:Accept:text/html,少空格会导致服务器无法识别);
- 分类逻辑:通用头:请求和响应都能⽤,如Date“Cache-Control”;请求头:仅客户端发给服务器,如Accept“User-Agent”;响应头:仅服务器回客户端,如Location“Set-Cookie”;实体头:描述请求 / 响应的资源内容,如Content-Type“Content-Length”;
- 快速查找:按Ctrl+F输入 Header 名称(如 “Cache-Control”),可直接定位到目标内容。
二、通用头:请求 / 响应都能用的 “公共指令”
通用头不绑定特定资源,主要用于控制 “事务流程”(如缓存、连接、时间),是 HTTP 通信的 “基础规则”。
|
Header 名称 |
核心作用 |
示例 |
场景 + 避坑提示 |
|
Cache-Control |
控制缓存策略(最核心的缓存指令) |
Cache-Control: no-cache, max-age=3600 |
场景: – 静态资源(图片 / CSS)设max-age=86400(缓存 1 天); – 动态接口(用户信息)设no-cache(每次验证新鲜度);避坑:no-cache不是 “不缓存”,是 “缓存前需验证”,no-store才是 “完全不缓存”(敏感数据用) |
|
Date |
发送请求 / 响应的时间(GMT 格式) |
Date: Tue, 15 Nov 2025 08:12:31 GMT |
场景:排查 “服务器时间偏差” 导致的签名过期问题(如 JWT 校验失败时,对比客户端与服务器 Date);避坑:必须用 GMT 时间,不能用本地时间(如 “2025-11-15 16:12:31” 会报错) |
|
Connection |
控制 TCP 连接是否持久化(HTTP/1.1 核心) |
Connection: keep-alive /close |
场景: – 长连接(默认keep-alive):减少 TCP 握手开销,适合多请求场景; – 短连接(close):单请求后断开,适合高并发低耗时场景;避坑:HTTP/2 已默认启用多路复用,无需手动设Connection,设了反而可能冲突 |
|
Pragma |
兼容 HTTP/1.0 的缓存指令(逐渐被替代) |
Pragma: no-cache |
场景:适配老旧客户端(如 IE 浏览器),与Cache-Control配合用(Pragma: no-cache+Cache-Control: no-cache);避坑:仅支持no-cache值,不支持max-age,新项目优先用Cache-Control |
|
Via |
记录请求 / 响应经过的代理服务器(链路追踪) |
Via: 1.0 proxy1.com (Apache/1.1), 1.1 proxy2.com |
场景:排查 “代理导致的请求异常”(如接口超时,看是否卡在某层代理);避坑:代理服务器必须正确添加Via,否则无法追踪完整链路 |
|
Warning |
提示资源可能存在的问题(非错误,仅警告) |
Warning: 199 Miscellaneous warning “资源即将过期” |
场景:服务器返回 “缓存即将失效”“资源备用地址” 等提示;避坑:Warning不影响请求 / 响应正常处理,仅用于辅助调试,不要依赖它做业务逻辑 |
三、请求头:客户端发给服务器的 “需求说明”
请求头是客户端告知服务器 “我要什么、我能接受什么”,列如接受的内容类型、身份信息、来源地址,是接口适配和安全验证的核心。
(一)内容协商类:告知服务器 “我能处理什么”
|
Header 名称 |
核心作用 |
示例 |
场景 + 避坑提示 |
|
Accept |
指定客户端能接受的内容类型(MIME) |
Accept: text/html, application/json, */* |
场景: – 前端调接口时设Accept: application/json(只要 JSON 响应); – 浏览器访问网页时设Accept: text/html;避坑:*/*表明 “接受所有类型”,但尽量明确(如只接受 JSON),避免服务器返回不兼容格式 |
|
Accept-Charset |
客户端能接受的字符编码(如 UTF-8) |
Accept-Charset: utf-8, iso-8859-1;q=0.5 |
场景:适配多语言场景(如中文项目必须设utf-8);避坑:q=0.5表明优先级(0-1,1 最高),不设默认 1,提议优先用utf-8,避免乱码 |
|
Accept-Encoding |
客户端支持的压缩格式(减传输体积) |
Accept-Encoding: gzip, deflate, br |
场景:所有请求都提议设(服务器返回压缩后的响应,体积减 50%-80%);避坑:br(Brotli)比gzip压缩率更高,优先支持,但需服务器也支持(Nginx/Apache 需配置) |
|
Accept-Language |
客户端能接受的语言(如中文、英文) |
Accept-Language: zh-CN, en-US;q=0.8 |
场景:多语言网站(如设zh-CN返回中文页面,en-US返回英文);避坑:语言标识要规范(如zh-CN不是zh,en-US不是en),否则服务器无法识别 |
(二)身份与来源类:告知服务器 “我是谁、我从哪来”
|
Header 名称 |
核心作用 |
示例 |
场景 + 避坑提示 |
|
Authorization |
客户端身份验证信息(如 Token、Basic Auth) |
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9… |
场景: – JWT 令牌:Bearer + Token(接口鉴权); – 基础认证:Basic + Base64(用户名:密码)(仅测试用,不安全);避坑:生产环境用Bearer(JWT/OAuth2),不要用Basic(Base64 可解码,明文风险) |
|
Cookie |
客户端保存的 Cookie(登录态、用户配置) |
Cookie: UserID=123; Token=abc; Skin=dark |
场景:保持登录态(服务器通过Set-Cookie设置,客户端下次请求自动携带);避坑:敏感信息(如密码)不要存 Cookie,设HttpOnly(防 JS 读取)和Secure(仅 HTTPS 传输) |
|
Host |
指定服务器域名 + 端口(HTTP/1.1 必传) |
Host: www.example.com /Host: api.example.com:8080 |
场景:虚拟主机(一台服务器多域名,靠Host区分);避坑:HTTP/1.1 必须传Host,否则服务器返回 400 错误,端口默认 80(HTTP)/443(HTTPS)可省略 |
|
Referer |
当前请求的来源页面(“来路”) |
Referer: https://www.example.com/login |
场景: – 防盗链(如图片只允许从自家域名引用); – 统计来源(如用户从哪个页面跳转来);避坑:直接输入 URL 或书签访问时,Referer为空,不要依赖它做必选验证 |
|
User-Agent |
客户端设备 / 浏览器信息(适配用) |
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36 |
场景: – 适配移动端 / PC 端(识别Mobile关键词); – 排查浏览器兼容性(如 Chrome/Firefox 差异);避坑:不要靠User-Agent完全判断设备,优先用响应式设计,User-Agent可伪造 |
(三)条件请求类:告知服务器 “满足条件才返回”
|
Header 名称 |
核心作用 |
示例 |
场景 + 避坑提示 |
|
If-Modified-Since |
仅资源在指定时间后修改过,才返回 200(否则 304) |
If-Modified-Since: Sat, 29 Oct 2025 19:43:31 GMT |
场景:缓存静态资源(如图片,第一次返回Last-Modified,下次请求带这个 Header,未修改返回 304,减少传输);避坑:时间格式必须是 GMT,且只准确到秒,毫秒级修改无法识别 |
|
If-None-Match |
仅资源的 ETag 与指定值不同,才返回 200(否则 304) |
If-None-Match: “abc123def456” |
场景:比If-Modified-Since更精准(如文件内容改了但修改时间没变);避坑:ETag 值要带引号(如”abc”不是abc),服务器返回的 ETag 格式要统一 |
|
Range |
请求资源的部分内容(断点续传) |
Range: bytes=0-499(前 500 字节) /Range: bytes=500-(从 500 字节到结尾) |
场景: – 大文件下载(如视频,支持断点续传); – 分片上传(请求部分内容验证);避坑:服务器支持的话返回 206(Partial Content),不支持返回 416(Requested Range Not Satisfiable) |
四、响应头:服务器回客户端的 “处理结果说明”
响应头是服务器告知客户端 “我返回了什么、你该怎么处理”,列如缓存规则、重定向地址、Cookie 设置,是控制客户端行为的核心。
(一)缓存控制类:告知客户端 “怎么缓存资源”
|
Header 名称 |
核心作用 |
示例 |
场景 + 避坑提示 |
|
ETag |
资源的唯一标识(如内容哈希,配合 If-None-Match) |
ETag: “abc123def456” /ETag: W/”abc123″(W 表明弱验证) |
场景:精准控制缓存(内容变则 ETag 变);避坑:弱验证(W / 前缀)适合动态内容(如带时间戳的页面),强验证适合静态内容(如图片) |
|
Last-Modified |
资源最后修改时间(配合 If-Modified-Since) |
Last-Modified: Tue, 15 Nov 2025 12:45:26 GMT |
场景:静态资源缓存(如 CSS/JS);避坑:如果资源修改频繁(如每秒改),Last-Modified精度不够,提议用 ETag |
|
Expires |
资源过期时间(HTTP/1.0 缓存指令,优先级低于 Cache-Control) |
Expires: Thu, 01 Dec 2025 16:00:00 GMT |
场景:兼容老旧客户端(与Cache-Control配合用);避坑:时间必须是 GMT,且服务器时间要准,否则缓存会提前失效或过期不失效 |
|
Vary |
告知客户端 “哪些 Header 变化会导致响应不同” |
Vary: Accept-Encoding, Accept-Language |
场景:CDN 缓存(如不同Accept-Encoding返回不同压缩格式,CDN 靠Vary区分缓存);避坑:不要设Vary: *(会导致 CDN 无法缓存),明确指定具体 Header |
(二)跳转与会话类:控制客户端跳转和登录态
|
Header 名称 |
核心作用 |
示例 |
场景 + 避坑提示 |
|
Location |
重定向地址(配合 3xx 状态码) |
Location: |
场景: – 登录后跳首页(302 临时跳转); – 域名变更跳新地址(301 永久跳转);避坑:301 是永久跳转(浏览器会缓存),临时跳转用 302/307,不要混用 |
|
Set-Cookie |
服务器向客户端设置 Cookie(登录态、配置) |
Set-Cookie: UserID=123; Max-Age=86400; HttpOnly; Secure; SameSite=Lax |
场景:设置登录态(Max-Age是存活秒数);避坑: – 加HttpOnly(防 XSS 窃取); – 加Secure(仅 HTTPS 传输); – 加SameSite=Lax(防 CSRF) |
|
Refresh |
客户端自动刷新 / 跳转(非标准,但浏览器支持) |
Refresh: 5; url=https://www.example.com/timeout |
场景:登录超时后 5 秒跳登录页;避坑:不是 HTTP 标准头,优先用Location+3xx 状态码,仅临时场景用(如页面提示后跳转) |
(三)内容与安全类:告知客户端 “返回内容是什么、怎么安全处理”
|
Header 名称 |
核心作用 |
示例 |
场景 + 避坑提示 |
|
Content-Encoding |
服务器返回内容的压缩格式(对应 Accept-Encoding) |
Content-Encoding: gzip |
场景:返回压缩后的资源(配合客户端Accept-Encoding);避坑:客户端必须支持对应的压缩格式,否则无法解压(如客户端没设Accept-Encoding: gzip,服务器不要返回gzip) |
|
Content-Length |
返回内容的字节数(固定长度时用) |
Content-Length: 1024 |
场景:返回固定长度的资源(如 JSON、图片);避坑:不能与Transfer-Encoding: chunked同时用(chunked 是分块传输,长度不固定),否则服务器返回 400 错误 |
|
Content-Type |
返回内容的 MIME 类型(核心,避免乱码) |
Content-Type: application/json; charset=utf-8 /Content-Type: text/html; charset=utf-8 |
场景: – 接口返回 JSON:application/json; – 网页返回 HTML:text/html; – 图片:image/jpeg/image/png;避坑:必须加charset=utf-8,否则中文会乱码,MIME 类型要准确(如 JSON 不能设text/plain) |
|
Server |
服务器软件信息(如 Nginx、Apache) |
Server: Nginx/1.22.1 /Server: Apache/2.4.54 |
场景:排查服务器兼容性(如 Nginx 与 Apache 的配置差异);避坑:生产环境可隐藏具体版本(如Server: Nginx),减少被攻击的风险(黑客不会知道具体漏洞版本) |
|
WWW-Authenticate |
告知客户端 “需要身份验证”(配合 401 状态码) |
WWW-Authenticate: Basic realm=”登录验证” |
场景:需要登录的接口(客户端未带Authorization时,返回 401 + 这个 Header);避坑:仅用于基础认证,生产环境用 OAuth2/JWT,不要依赖它做复杂鉴权 |
五、实体头:描述请求 / 响应的 “资源内容属性”
实体头既可用在请求(如 POST 的表单内容),也可用在响应(如返回的文件内容),核心是 “描述资源本身的属性”。
|
Header 名称 |
核心作用 |
示例 |
场景 + 避坑提示 |
|
Content-Language |
资源的语言(如中文、英文) |
Content-Language: zh-CN |
详细信息:https://tool.wanxiangsucai.com/httpheader/















暂无评论内容