HTTP首部讲解
HTTP首部是HTTP报文的关键部分,用于传递元数据和控制通信行为。主要分为通用首部(如Cache-Control、Connection)、请求首部(如Host、User-Agent)、响应首部(如Server、Location)和实体首部(如Content-Type、Content-Length)。Cookie相关首部(Set-Cookie和Cookie)实现状态管理,其他重要首部如CORS、H
HTTP 首部详解
HTTP 通信的核心在于其报文结构,而首部(Header)则是报文中传递元数据的关键部分。它位于起始行之后、空行之前,由一系列键值对组成,用于控制通信行为、描述报文主体属性、传递客户端与服务器的能力信息等。
一、HTTP 报文首部概述
HTTP 报文首部用于传递关于报文本身的元数据(如编码、长度、语言、缓存控制等)。
分类:
- 通用首部:适用于请求和响应报文,如
Date、Cache-Control。- 请求首部:仅用于请求报文,由客户端发送,说明自身能力和请求细节,如
Host、User-Agent、Accept。- 响应首部:仅用于响应报文,由服务器发送,说明自身信息和响应细节,如
Server、Location。- 实体首部:用于描述报文实体主体(实际传输的数据)的属性,可出现在请求或响应中(只要包含主体),如
Content-Type、Content-Length、Content-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 状态管理机制。
-
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 -
Cookie(请求首部) 客户端向服务器发送之前存储的 Cookie。多个 Cookie 用;分隔。 示例:Cookie: session_id=abc123; user_pref=dark_mode
工作流程:
- 服务器响应:
Set-Cookie。 - 客户端存储 Cookie(遵守属性限制)。
- 客户端后续请求:
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 应用至关重要。
更多推荐


所有评论(0)