调接口时看到 X-Forwarded-For、Sec-Fetch-Site、If-None-Match 一脸懵?这里把 10 类 67 个常用请求头整理成一张表:中文含义、真实示例值、什么时候用,以及它到底是不是 IETF 标准,支持关键字搜索与一键复制。
按分类筛选或直接搜索;每条给出中文含义 + 示例值 + 使用场景,并标注来源是否为 IETF 标准。
状态码回答「这次请求结果如何」,请求头则回答「客户端到底要什么、是谁、能不能复用缓存」。很多线上问题的根因都藏在请求头里:Content-Type 写错导致后端解析失败报 415;If-None-Match 命中导致返回 304 让你以为接口没生效;加了自定义头触发 CORS 预检 OPTIONS,而服务端没放行 Access-Control-Allow-Headers。
更麻烦的是「是不是标准」这件事本身就很混乱:X-Forwarded-For、X-Request-Id、X-Real-IP 几乎所有项目都在用,但它们从来没有被写进 IETF 标准文档,只是事实标准;而 Forwarded(RFC 7239)才是官方给出的替代方案。反过来,Sec-Fetch-*、Sec-CH-UA 这些看着眼生的头,反而是有规范背书的。
这份速查表按内容协商、认证与凭证、缓存与条件请求、请求体、请求上下文、范围与连接、跨域与安全、客户端提示、代理与链路、常见非标准共 10 类收录 67 个请求头,每条都标明来源。所有内容为静态文档,无任何网络请求,可离线使用。
cookie、跨域、缓存),表格会即时过滤。Host 是 HTTP/1.1 里唯一必需的请求头,虚拟主机靠它区分同一 IP 上的不同站点。Content-Type 决定服务器如何解析请求体:提交表单常用 application/x-www-form-urlencoded,提交 JSON 必须写 application/json; charset=utf-8。Authorization: Basic xxx 只是 base64 编码而不是加密,任何人都能还原,必须走 HTTPS。X-Token)的跨域请求会触发 CORS 预检,服务端必须放行 Access-Control-Allow-Headers。Sec-CH-*(Client Hints)绝大多数需要服务端先用响应头 Accept-CH 声明,且仅在 HTTPS 下发送。X-Forwarded-For 可以伪造:取客户端 IP 时应只信任你可控的那一级代理写入的值,别拿它做安全依据。Referer 是规范里的拼写(少一个 r),可能为空或被 Referrer-Policy 裁剪,不要依赖它做鉴权。Forwarded 头(for=192.0.2.60;proto=https;host=example.com)作为替代,但生态普及度远不如 X-Forwarded-For。本工具把这类头统一标为「非标准」,不代表它不该用,只是提醒你它的格式没有规范保证。client, proxy1, proxy2),客户端可以在发起请求时就伪造一个前缀,让你的程序读到假 IP。正确做法:只信任你自己可控的代理写入的那一段(通常从右往左数第 N 级),或者直接让最外层可信代理覆盖写入 X-Real-IP。用它做限流、封禁等安全判断时尤其要谨慎。X-Token、Authorization),浏览器会先发一个 OPTIONS 预检,带上 Access-Control-Request-Method 与 Access-Control-Request-Headers,询问服务端是否允许。服务端必须响应对应的 Access-Control-Allow-Headers 与 Access-Control-Allow-Methods,否则正式请求不会发出。想减少预检,可以把预检结果缓存(Access-Control-Max-Age)。If-None-Match 比对资源的 ETag(内容指纹),If-Modified-Since 比对最后修改时间。ETag 精度更高(能识别 1 秒内多次修改、内容变回原样等情况),且同时存在时服务器优先判断 If-None-Match。条件成立返回 200 全量内容,不成立返回 304 Not Modified,客户端继续用本地缓存。Accept-CH: Sec-CH-UA-Arch, Sec-CH-UA-Model(或等价的 meta 标签)声明需要哪些,后续同源请求才会带上,且一般只在安全上下文(HTTPS)下生效。基础的 Sec-CH-UA、Sec-CH-UA-Mobile、Sec-CH-UA-Platform 属于「低熵」提示,浏览器会默认发送。Content-Length 用于长度已知的请求体,Transfer-Encoding: chunked 用于长度未知时分块传输。如果同时出现,规范要求忽略 Content-Length,实际实现里还可能被判定为请求走私(Request Smuggling)而被拒绝。日常开发中请求体长度一般由 HTTP 客户端自动计算,不需要手工设置。content-type 与 Content-Type 等价,规范推荐用连字符大写形式(Content-Type)。需要注意的是 HTTP/2 与 HTTP/3 强制要求头字段名小写,传输时会统一转成小写;头值仍然大小写敏感(比如 Bearer、ETag 的内容)。审核通过后就会展示在留言板上,稍安勿躁~
还没有留言,来抢沙发吧!