一图看懂核心 HTTP Headers
2025/10/31...大约 8 分钟
解密网络的“悄悄话”:一图看懂核心 HTTP Headers

 每当您在浏览器中输入一个网址并按下回车键时,一场“对话”就在幕后悄然发生。您的浏览器(客户端)和网站的服务器(服务端)正在通过一种叫做 HTTP(超文本传输协议)的语言进行交流。
这场对话不仅仅是“嘿,请给我那个网页”和“好的,给你”。它包含了丰富的上下文信息,这些信息通过 HTTP Headers(HTTP 标头) 来传递。
您提供的这张信息图(来自 Neo Kim)为我们提供了一个极佳的概览,它将这些关键的标头分成了五大类。今天,我们就以这张图为蓝本,深入解析这些“元数据”是如何驱动现代网络的。
🌐 通用标头 (General Headers):对话的基础
通用标头是既可以出现在请求中,也可以出现在响应中的标头,它们提供了关于事务本身的通用上下文。
- Host: 这是客户端在请求时必须包含的。它告诉服务器客户端想要访问的是哪个网站。为什么需要这个?因为一台物理服务器可能托管着成百上百个网站。
- Date: 响应标头,非常直白,就是服务器生成并发送响应时的日期和时间。
- Cache-Control: 缓存控制的“总开关”。它通过max-age=3600(缓存一小时)、no-cache(每次都需验证)等指令,精细地控制浏览器或代理服务器应如何缓存资源。
- Age: 当你从缓存中获取一个资源时,Age标头会告诉你这个资源在缓存中已经“待了”多久(以秒为单位)。
- Vary: 一个非常重要但常被忽视的缓存标头。它告诉缓存服务器,在决定是否使用缓存版本之前,还需要检查哪些请求标头。例如,Vary: Accept-Encoding意味着对gzip压缩的请求和未压缩的请求应被视为不同的缓存条目。
- Via: 当一个请求或响应经过一个或多个代理(如 CDN、防火墙)时,Via标头会像“路书”一样记录下它“途经”的站点。这在调试复杂的网络链路时非常有用。
⬆️ 请求标头 (Request Headers):客户端的“需求清单”
这些标头由客户端(通常是您的浏览器)发送给服务器,用以说明它想要什么以及它能理解什么。
- User-Agent: 客户端的“自我介绍”。它告诉服务器“我是谁”,例如“我是在 Windows 11 上的 Chrome 浏览器”或“我是一台 iPhone 上的 Safari 浏览器”。服务器可以据此提供定制内容(例如,移动版网页)。
- Accept: 客户端告诉服务器它能理解哪些内容格式,例如 text/html(网页)、application/json(JSON数据)、image/webp(WebP图片)。
- Accept-Language: 客户端声明它的语言偏好,如 zh-CN, en;q=0.9(首选简体中文,其次是英语)。服务器应据此返回相应语言的页面。
- Accept-Encoding: 客户端声明它支持的压缩算法,如 gzip, deflate, br。服务器会选择一种算法来压缩响应体,以减少传输大小。
- Cookie: 客户端将之前由服务器通过 Set-Cookie存储的数据“带回”给服务器。这是实现用户登录状态、会话跟踪和个性化推荐的核心机制。
- Referer: 告诉服务器用户是从哪个页面点击链接跳转过来的。
⬇️ 响应标头 (Response Headers):服务器的“回复与指令”
这些标头由服务器发送给客户端,提供了关于响应本身的额外信息。
- Location: 当服务器返回一个重定向状态码(如 301 或 302)时,Location标头会告诉浏览器“你要找的资源不在这里,请去这个新地址”。
- Set-Cookie: 服务器的“指令”:“请浏览器存储这个数据(cookie)”。下次你再来访问时,请用 Cookie标头把它带回来。
- Access-Control-Allow-Origin: 这是 CORS(跨域资源共享)机制的核心。它声明了哪些其他域名的网页被允许读取这个响应。如果设为 *,则表示任何域名都可以。
- Accept-Ranges: 服务器声明它是否支持“范围请求”(即只请求文件的一部分)。这对于大文件下载和视频流(允许拖动进度条)至关重要。
- Content-Range: 对应客户端的 Range请求,服务器用此标头告知“我正在发送的是文件的哪一部分”(例如,bytes 21010-47021/47022)。
- ETag: 资源的“唯一版本标识符”。它通常是一个哈希值。当资源内容改变时,ETag也会改变。
📦 负载标头 (Payload Headers):关于“货物”的详细说明
这些标头描述的是消息主体(payload)本身,即你实际请求的数据(如 HTML 文档、JSON 文件、图片)。
- Content-Type: 明确告知客户端消息主体到底是什么。例如 text/html; charset=utf-8(这是一个使用UTF-8编码的HTML文档)或application/json。
- Content-Length: 消息主体的确切大小(以字节为单位)。
- Content-Encoding: 服务器确认它实际使用了哪种压缩算法(如 gzip)来压缩响应体。浏览器收到后会据此进行解压。
- Content-Language: 声明消息主体内容所使用的人类语言(例如 zh-CN)。
- Content-Disposition: 指示浏览器应如何处理这个资源。inline表示应尝试在浏览器中直接显示(如图片、PDF);attachment; filename="data.zip"则会提示用户将其作为附件下载。
- Last-Modified: 资源在服务器上最后一次被修改的日期和时间。
🛡️ 安全与条件标头 (Security & Conditional Headers)
最后这一组(在原图中第五行)是保障网络安全和提升效率的关键,它混合了安全指令和用于高效缓存的条件请求。
- Authorization: (注:原图此处标题误标为 Last-Modified,但根据描述“凭证,如令牌或 API 密钥”,其应为Authorization)。这是客户端向服务器证明自己身份的方式,通常用于受保护的 API 请求,例如Authorization: Bearer <your_jwt_token>。
- Range: 这是一个请求标头,客户端用它来告诉服务器:“我不想要整个文件,我只想要这一部分(范围)”。
- If-Modified-Since: 这是一个条件请求标头。浏览器在缓存了某个资源后,会带上这个标头(值是上次收到的 Last-Modified日期),询问服务器:“这个资源自 这个时间 以来有更新吗?”
- If-None-Match: 类似的条件请求标头,但它使用的是 ETag。浏览器询问:“我本地版本的ETag是这个,你服务器上的版本和它不一样吗?”
缓存如何工作?
结合
ETag和If-None-Match(或Last-Modified和If-Modified-Since):
- 浏览器请求资源,服务器返回资源和
ETag: "v1"。- 浏览器缓存资源和
ETag。- 下次再请求时,浏览器发送
If-None-Match: "v1"。- 服务器比较 ETag:
- 如果未变,服务器返回一个极轻量的
304 Not Modified响应(“未修改”),浏览器直接使用缓存。- 如果变了,服务器返回
200 OK和新的资源内容。
- Content-Security-Policy (CSP): 强大的响应标头,用于抵御 XSS(跨站脚本攻击)。它定义了一个“白名单”,告诉浏览器只允许从哪些来源加载脚本、样式、图片等资源。
- Strict-Transport-Security (HSTS): 极其重要的安全响应标头。它强制浏览器在未来一段时间内(例如 max-age=31536000,一年)只能通过 HTTPS 访问此站点,彻底杜绝不安全的 HTTP 请求,防止中间人攻击。
总结
HTTP Headers 就像是网络的神经系统,传递着使现代 Web 得以高效、安全运行所必需的所有上下文。它们管理着缓存、处理身份验证、协商内容格式,并保护我们免受攻击。
这张信息图为我们提供了一张宝贵的地图,下次当您在开发或调试网络问题时,不妨回想一下这些标头,它们可能正掌握着解开谜团的关键。