ByteNoteByteNote
十四个请求头按用途来记
字

字节笔记本

2026年10月7日 · 约 9 分钟读完

十四个请求头按用途来记

API中转
¥120

一次请求里,头字段分成几组看,比按字母背名字有用。对话里的中文说明覆盖了十四个字段:谁在访问、身体是什么类型、缓存怎么走、身份放在哪、连接要不要留下。下面按这个分组复述每个字段在做什么,不按色块抄一份图表。

先分清谁在访问,再看正文类型

谁在访问,从哪来

Host 是目标站点的域名,HTTP/1.1 里这只请求必须带。同一台机器上多个站点靠它区分。Origin 是发起方的方案、主机和端口,跨源时服务器用它决定允不允许。Referer 是发出这次请求的页面地址,用来看流量从哪一页过来。拼写是对话里写的那一个,少一个 r,协议就这么定的。

User-Agent 标识客户端软件,用来区分浏览器或做统计。不要用它当安全边界,客户端可以改。X-Requested-With 常被用来标记这是脚本发出的请求,样本值提到 XMLHttpRequest。有这个头只说明调用方愿意这么标,没有它不能证明不是脚本。

X-Forwarded-For 由代理填写,用来留下原始客户端地址,给日志和风控看。它经过的每一跳都可能追加。直接信任最左边或最右边的地址,取决于你的代理是否会覆盖。对话只说明它用于识别原始地址,没有规定取哪一段。接在自己的反向代理后面时,要和代理约定写在哪。

正文、编码和缓存

Content-Type 说明请求体的媒体类型,样本是 application/json。和正文实际格式不一致时,对方会按错误的方式解析。Accept 是调用方愿意接收的类型,也可以是 application/json。一个是“我发的是什么”,一个是“我能收什么”。不要写成同一个头。

Accept-Encoding 告诉服务器客户端能解哪些压缩,样本提到 gzip 和 deflate。服务器按这个选压缩。客户端说了自己不会的编码,会解不开正文。

Cache-Control 约束缓存。样本点了 no-cache、no-store、must-revalidate。no-store 是不要留下副本。no-cache 不是“禁止使用缓存”这五个字的日常意思,对话把它和另外两个并列,当作缓存行为的指令。使用时按具体取值,不要用字段名代替取值。

Connection 决定这次事务之后连接是否还留着。样本的取值是 keep-alive 或 close。短连接用 close。要复用就留着。这不决定正文能不能缓存。

身份在头里,不要写进地址

Authorization 带凭证,例如令牌。它用于需要核验的接口。令牌放在这个头里,不要放进查询串,查询会进日志。Cookie 是客户端把已经存下的饼干随请求送回,用来维持会话或偏好。Set-Cookie 是服务器让客户端存下一份,以后的请求再带上。方向相反。把 Set-Cookie 放在请求里,或把 Cookie 当成响应里设置的那一个,会话会对不上。

响应要设置饼干时用 Set-Cookie。后续请求才出现 Cookie。只看其中一个,会以为身份丢了。

这十四个字段里,和跨源相关的是 Origin,和压缩相关的是 Accept-Encoding,和代理后的地址相关的是 X-Forwarded-For。排错时先看 Content-Type 和 Accept 是否一对,再看身份在 Authorization 还是饼干,最后看缓存取值是不是 no-store。

身份走头,不走查询串

按组核对,不按颜色

访问者看 Host、Origin、Referer、User-Agent。正文看 Content-Type、Accept、Accept-Encoding。缓存看 Cache-Control 的具体取值。身份看 Authorization 与一对饼干头的方向。连接看 keep-alive 还是 close。代理后的客户端地址看 X-Forwarded-For,并和自己的代理约定取哪一段。脚本标记 X-Requested-With 只是调用方的声明。

排错时按失败现象对字段

接口返回类型解析错误,先看请求的 Content-Type 是不是 application/json,再看对方是否按这个类型读正文。调用方说自己只收 JSON,看的是 Accept,不是 Content-Type。压缩后解不开,看 Accept-Encoding 里有没有 gzip 或 deflate,以及服务器选了哪一个。不要把解不开归到 Content-Type。

跨源被拒绝,看 Origin 是否带了方案、主机和端口。只带主机、不带方案,和页面实际来源不一致。Referer 是来源页面的完整地址,可有可无取决于策略,它不代替 Origin。Host 错了会进到另一台虚拟主机,正文格式都对也会 404。HTTP/1.1 没有 Host 时,请求本身就不完整。

身份失败时分开看。令牌应在 Authorization。会话应是响应里曾经 Set-Cookie,随后请求里出现 Cookie。只有响应、没有后续请求,当然看不到 Cookie。把令牌放进查询串,头里是空的,核验会失败,查询还会进访问日志。

缓存了不该留的响应,看 Cache-Control 是否写了 no-store。只写字段名、不写取值,等于没约束。no-cache 与 no-store 不要互换。连接被提前关掉,看是不是 Connection: close。要复用就用 keep-alive。代理后面的地址异常,看 X-Forwarded-For 是否由你的代理写入,不要直接采信客户端自己带的那一串。X-Requested-With 缺失只说明没有这句声明,不能单独当成伪造请求的证据。

Host 在 HTTP/1.1 里必须有,值是域名,也可以带端口。同一 IP 上多个站点靠它分发。Origin 由方案、主机、端口组成,给跨源判断用。Referer 是来源页的地址,拼写少一个 r。三者不要互相填到对方的字段里。

Content-Type 描述这次发出的正文,样本值是 application/json。Accept 描述能接收的类型。Accept-Encoding 描述能解开的压缩,样本点了 gzip 和 deflate。压缩失败不要误改媒体类型。

Cache-Control 的取值在样本里是 no-cache、no-store、must-revalidate。要留下的副本用不到 no-store。Connection 只在 keep-alive 和 close 之间选,它不决定缓存。

Authorization 放令牌。Set-Cookie 是响应让客户端保存,Cookie 是之后的请求把保存的值送回。X-Forwarded-For 由代理追加原始地址,取哪一段要和自己的代理约定。X-Requested-With 只是调用方愿意标成 XMLHttpRequest,缺失不能单独当证据。User-Agent 可以改,不能当安全边界。 核对顺序可以按现象走。解析失败先看 Content-Type 与正文是否都是 JSON,再看 Accept 是否把能接收的类型说成了别的。解不开再看 Accept-Encoding。跨源失败看 Origin 是否包含方案和端口,不要用 Referer 代替。进错站点看 Host。身份失败看令牌是否在 Authorization,饼干是否先由 Set-Cookie 写下、再由 Cookie 带回。不该缓存的响应看有没有 no-store。连接被拆掉看是不是 close。代理后的客户端地址只采信自己的代理写进 X-Forwarded-For 的那一段。User-Agent 和 X-Requested-With 都是客户端自己填的,只能当线索,不能当证明。

这十四个字段按用途分组之后,排错就不用按字母表去找。主机决定进哪一个站点。来源决定跨源判断。来源页只说明从哪一页点过来。正文类型和能接收的类型是两件事。压缩失败去看编码而不是媒体类型。缓存要看具体取值,不要只写字段名。令牌走专用头,不要放进地址。饼干是先在响应里写下,再在后续请求里送回。连接只决定这次之后还留不留。代理后的地址只采信自己的代理。客户端自己填的软件名和脚本标记,只能当线索。

相关文章

分享: