HTTP 首部详解

HTTP 通信的核心在于其报文结构,而首部(Header)则是报文中传递元数据的关键部分。它位于起始行之后、空行之前,由一系列键值对组成,用于控制通信行为、描述报文主体属性、传递客户端与服务器的能力信息等。

一、HTTP 报文首部概述

HTTP 报文首部用于传递关于报文本身的元数据(如编码、长度、语言、缓存控制等)。

分类

  • 通用首部:适用于请求和响应报文,如 DateCache-Control
  • 请求首部:仅用于请求报文,由客户端发送,说明自身能力和请求细节,如 HostUser-AgentAccept
  • 响应首部:仅用于响应报文,由服务器发送,说明自身信息和响应细节,如 ServerLocation
  • 实体首部:用于描述报文实体主体(实际传输的数据)的属性,可出现在请求或响应中(只要包含主体),如 Content-TypeContent-LengthContent-Encoding

首部使得 HTTP 协议能够支持复杂的功能,如内容协商、缓存控制、持久连接、认证授权等。

二、HTTP/1.1 通用首部字段

这些字段适用于请求和响应报文,与报文传输本身相关。

主要字段

  • Cache-Control:控制缓存行为(如 public, private, max-age=3600, no-cache, no-store)。
  • Connection:管理连接(如 keep-alive 维持持久连接,close 关闭连接)。
  • Date:报文创建的日期时间(RFC1123 格式)。
  • Pragma:HTTP/1.0 遗留字段,通常用于兼容性(如 Pragma: no-cache)。
  • Trailer:声明报文主体之后(尾部)会包含哪些首部字段(用于分块传输)。
  • Transfer-Encoding:指定报文主体的传输编码方式(如 chunked)。
  • Upgrade:用于升级到其他协议(如 Upgrade: websocket)。
  • Via:记录请求或响应经过的代理服务器路径(用于防止循环、调试)。
  • Warning:携带关于报文状态的附加警告信息(如缓存过期)。

三、请求首部字段

客户端在请求报文中使用,向服务器传达请求的详细信息。

常用字段

  • Host:指定请求资源的目标服务器域名和端口号(必需字段,用于虚拟主机)。
  • User-Agent:标识发出请求的客户端软件信息(如浏览器类型、版本、操作系统)。
  • Accept:告知服务器客户端能够处理的媒体类型及优先级(如 text/html, application/json)。
  • Accept-Encoding:告知服务器客户端支持的内容编码方式(如 gzip, deflate)。
  • Accept-Language:告知服务器客户端首选的自然语言(如 zh-CN, en-US)。
  • Authorization:包含用于访问受保护资源的凭证(如 Bearer token, Basic base64-credentials)。
  • Referer:提供当前请求的来源页面 URL。
  • Range:请求资源的指定部分内容(用于断点续传或分块下载)。
  • If-Modified-Since / If-None-Match:条件请求,仅在资源满足特定条件(未修改或 ETag 不匹配)时才要求服务器返回资源本体。
  • Cookie:携带之前由服务器通过 Set-Cookie 设置并存储在本地的 Cookie 信息。
  • Content-Type / Content-Length:当请求包含主体时(如 POST, PUT),描述主体的媒体类型和大小(属于实体首部,但常见于请求)。

四、响应首部字段

服务器在响应报文中使用,向客户端传达响应的附加信息。

常用字段

  • Server:提供服务器软件的名称和版本信息(如 nginx/1.18.0, Apache)。
  • Location:指示客户端重定向至另一个 URL(配合 3xx 状态码使用)。
  • WWW-Authenticate:服务器要求客户端进行认证,并指定认证方案(配合 401 Unauthorized 状态码)。
  • Accept-Ranges:告知客户端是否支持范围请求(如 bytes 表示支持,none 表示不支持)。
  • Age:表示资源在代理缓存中已存活的秒数。
  • Retry-After:告知客户端多久之后可以重新发送请求(配合 503 Service Unavailable 或某些 3xx 状态码)。
  • Vary:告知代理服务器/缓存,响应内容会根据哪些请求首部字段而变化(如 Vary: Accept-Encoding)。
  • Proxy-Authenticate:代理服务器要求客户端进行认证(配合 407 Proxy Authentication Required 状态码)。
  • Set-Cookie:服务器向客户端写入 Cookie 信息(属于响应首部)。
  • Content-Disposition:指示客户端如何处理响应主体(如 attachment; filename="file.txt" 强制下载)。

五、实体首部字段

描述报文主体(实体)的属性,可出现在请求(有主体时)或响应中。

常用字段

  • Content-Type:实体主体的媒体类型(MIME type,如 text/html; charset=UTF-8, image/png)。
  • Content-Length:实体主体的字节长度。
  • Content-Encoding:应用于实体主体的编码方式(如 gzip, br)。
  • Content-Language:实体主体的自然语言(如 en, zh-CN)。
  • Content-Location:提供资源实际位置的替代 URL。
  • Content-Range:在部分响应中(状态码 206),表示当前片段在完整实体中的位置(如 bytes 1000-1999/5000)。
  • Content-MD5:实体主体的 MD5 校验和(用于完整性验证,已逐渐被更安全的机制取代)。
  • Expires:实体被认为过期的日期时间(用于缓存控制)。
  • Last-Modified:资源最后被修改的日期时间。

六、Cookie 相关首部字段

专用于 HTTP 状态管理机制。

  1. Set-Cookie (响应首部) 服务器向客户端写入 Cookie。一个响应可包含多个 Set-Cookie 字段。 属性(用 ; 分隔):

    • name=value:Cookie 的名称和值(必需)。
    • Expires=date:Cookie 的过期时间(GMT 格式)。
    • Max-Age=seconds:Cookie 的最大存活时间(秒,优先级高于 Expires)。
    • Domain=domain-name:指定 Cookie 生效的域名(默认为当前域名)。
    • Path=path:指定 Cookie 生效的 URL 路径(如 /)。
    • Secure:仅在使用 HTTPS 时发送 Cookie。
    • HttpOnly:禁止 JavaScript 访问 Cookie(防 XSS)。
    • SameSite=Strict/Lax/None:控制跨站请求时是否发送 Cookie(防 CSRF)。 示例
    Set-Cookie: session_id=abc123; Max-Age=3600; Secure; HttpOnly; SameSite=Lax
    

  2. Cookie (请求首部) 客户端向服务器发送之前存储的 Cookie。多个 Cookie 用 ; 分隔。 示例

    Cookie: session_id=abc123; user_pref=dark_mode
    

工作流程

  1. 服务器响应:Set-Cookie
  2. 客户端存储 Cookie(遵守属性限制)。
  3. 客户端后续请求:Cookie作用:会话管理、用户偏好、身份验证、跟踪。

七、其他重要首部字段

涵盖安全、跨域、性能优化等场景。

  • Access-Control-Allow-Origin (CORS):指定允许跨域请求的来源(如 *https://example.com)。
  • Strict-Transport-Security (HSTS):强制浏览器使用 HTTPS 访问(如 max-age=31536000)。
  • Content-Security-Policy (CSP):限制页面可加载资源的来源(防 XSS)。
  • X-Frame-Options:控制页面是否可被嵌入 <frame>, <iframe>, <embed>, <object>(防点击劫持,如 DENY, SAMEORIGIN)。
  • X-Content-Type-Options:阻止浏览器进行 MIME 类型嗅探(如 nosniff)。
  • Referrer-Policy:控制 Referer 首部携带的信息量(隐私)。
  • Alt-Svc:告知客户端可用的替代服务(如 HTTP/3)。
  • Upgrade-Insecure-Requests:客户端请求将页面上的 HTTP 资源升级为 HTTPS。

理解并正确应用这些 HTTP 首部字段,对于构建高效、安全、功能丰富的 Web 应用至关重要。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐