HTTP请求头速查表

粘贴一段请求头原文,拆出起始行与每个头字段,看清字段类别、值长度、能否在 fetch 里改写,以及各家实现对请求头体积的上限;解析在本地浏览器完成,不上传。

—

核心结论:请求头出问题时先看是「单条头超限」还是「全部头总量超限」——nginx 按单条 8 KB 卡,Tomcat 按整个请求头 8192 B 卡,Node.js 按 headers 总长 16 KB 直接断连,三种报错完全不同。

使用方法

  1. 把浏览器开发者工具里复制出来的请求头原文贴进文本框;页面已服务端直出一段示例,含起始行 1 行与头字段 12 行,整段 534 字符,打开即可看到解析结果。
  2. 按 Ctrl(Mac 上是 Command)+ Enter 触发解析;文本框里的 Enter 留给换行,不会误触发。
  3. 「字段名筛选」填字段片段即可只看匹配字段,例如填 cache 只看缓存相关头、填 content 只看协商与实体头;留空则列出全部。
  4. 结果区给出起始行、头字段行数、整段文本字符数、最长与最短字段、平均头值长度。
  5. 列表下方的三个按钮分别用于继续展开、以 TSV 复制当前表格、导出带 UTF-8 BOM 的 CSV(Excel 直接打开不乱码)。
  6. 点「重置为示例」回到初始那段请求头,方便重新对照。

这个HTTP请求头速查表能解决什么问题

调试跨域、缓存、鉴权或断点续传时,最耗时的往往不是改代码,而是确认「浏览器到底发了什么」。本页把一段请求头原文拆成可核对的清单:每个字段属于哪一类、值有多长、能不能在 fetch 里被改写。头被服务端拒掉时,可以按「单条超限」还是「总量超限」来判断方向——nginx 按单条 8 KB 卡并返回 400,整个头区超出服务器缓冲会被断连,431(RFC 6585)表示请求头字段过大,而被误当成头问题的 413 说的是请求体过大、与头无关。另外,Sec- 前缀、Host、Cookie、Accept-Encoding 这类由浏览器保留的标头,在 fetch 里写了也不会生效,本页把它们单独标出来,省去一轮无效排查。

计算原理与变量说明

解析按四步走:先统一换行符,再按行切分,然后从每一行里取出字段名与值,最后做长度与类别统计。

为什么「头太大」不能只靠一个数字判断?因为各家实现的卡点是两种口径混在一起。nginx 的 large_client_header_buffers 4 × 8k 限制的是单条头不超过 8 KB,超了返回 400;Apache 的 LimitRequestFieldSize 默认 8190 B 同样是单条头口径;Tomcat 的 maxHttpHeaderSize 默认 8192 B 限制的是整个请求头;Node.js 没有硬性的头条数上限,但 headers 总长超过 16 KB 会直接断开连接。于是「一条头很长的请求」与「很多条中等长度的头」会在同一台服务器上产生完全不同的结果,这也是排查时必须先看列表的最大单条长度、再看总量的原因。

431 与 413 为什么常被混淆:两者都在 4xx 里且都与「太大」有关,但 431 由 RFC 6585 定义为「请求头字段过大」,而 413 指的是请求体过大,和标准定义的头字段没有任何关系。看到 413 时去调头的大小,方向就完全错了。另外 HTTP/2 用 HPACK 压缩头部,上限由 SETTINGS_MAX_HEADER_LIST_SIZE 通告,常见取值是 8 KB 或 16 KB,和 HTTP/1.1 的字节数上限不能直接换算。

书写层面的两条硬规矩:头名大小写不敏感(content-type 与 Content-Type 等价),但冒号后必须有空格;同名头可以重复出现,服务端通常按逗号合并成一条。X- 前缀的自定义头则已被 RFC 6648 劝退——它本意是标记非标准扩展,一旦字段标准化就得改名字,反而制造兼容负担,所以推荐直接用不带前缀的业务名。

完整示例(数值仅作演示)

把示例原文粘进来(默认已填好)点「解析请求头」,应得到下面这组数,本页所有示例数字都由页面自身的算法复算得出。

HTTP请求头对照表

下表列出 16 个常用请求头字段的类别、能否由 JS 改写与常见取值。

字段名类别能否在 fetch 里改常见值
Host请求上下文不能,由浏览器自动填入www.liuquan.net
User-Agent请求上下文不能,属禁止修改的标头Chrome/131.0.0.0 Safari/537.36
Accept内容协商可以application/json, text/plain, */*
Accept-Encoding内容协商不能,浏览器保留gzip, deflate, br
Accept-Language内容协商随浏览器语言设置zh-CN,zh;q=0.9
Authorization凭证可以Bearer 令牌串
Cookie状态不能,按同源策略附加sid=8f3a91c2; theme=dark
Cache-Control缓存可以(请求侧)no-cache / max-age=0
If-None-Match条件请求可以,配合 ETag 取 304实体标签值
If-Modified-Since条件请求可以,配合 Last-ModifiedWed, 01 Oct 2026 00:00:00 GMT
OriginCORS不能,跨域与 POST 时自动带https://www.liuquan.net
Referer来源受 Referrer-Policy 控制https://www.liuquan.net/tools/
Range范围请求可以,断点续传与视频拖拽bytes=0-1023
X-Forwarded-For代理追加客户端可伪造成立203.0.113.42
Content-Type实体头可以,POST/PUT 必填application/json; charset=utf-8
Upgrade-Insecure-Requests导航不能,值固定为 11

下表是各家实现对请求头体积的上限,注意「单头」与「全部头」是两种口径。

实现配置项默认值约束口径与后果
nginxlarge_client_header_buffers4 × 8k单头 ≤ 8 KB,超出返回 400
ApacheLimitRequestFieldSize8190 B单头 ≤ 8190 B
TomcatmaxHttpHeaderSize8192 B整个请求头 ≤ 8 KB
Node.js http无硬性条数上限16 KBheaders 总长超 16 KB 直接断连
HTTP/2(HPACK)SETTINGS_MAX_HEADER_LIST_SIZE8 KB / 16 KB由对方通告,常见取这两档
Cookie(RFC 6265 建议下限)浏览器实现≥4096 B / ≥50 条单条不低于 4096 B,每域名不低于 50 条

下表是常见状态码与请求头的联动关系,状态码本身的定义请看专门的对照页。

状态码与请求头的联动
200正常返回,可带 ETag 供下次条件请求使用
204无响应体,Content-Length 省略
206Range 生效,响应带 Content-Range
301 / 302Location 必带
304If-None-Match 或 If-Modified-Since 命中
400头超长或头语法错误
401缺失或错误的 Authorization
403权限不足,与 401 的区别在于身份是否有效
405请求方法与路由不匹配
412If-Match 或 If-Unmodified-Since 未命中
413请求体过大,与头无关
431请求头字段过大(RFC 6585)

结果边界、舍入与适用说明

常见问题

为什么我在 fetch 里设置了 User-Agent 却不生效?

User-Agent 属于浏览器保留的「禁止修改的标头」,这类名字由浏览器自己填。Sec- 前缀的标头同样如此,JS 里写了会被静默忽略。若确实需要自定义标识,改用不带前缀的业务头。

头太长时到底会看到 400 还是 431?

取决于卡在哪一层。nginx 的 large_client_header_buffers 默认 4 × 8k,是单头口径,超过 8 KB 判 400;431 由 RFC 6585 定义,语义就是请求头字段过大。Tomcat 的 8192 B 针对整个头,Node.js 则在 headers 总长超过 16 KB 时直接断连。

413 是不是也属于头太大?

不是。413 指请求体过大,与头字段无关;真正在讲头过大的是 431。看到 413 应该去查上传体积、网关的 body 限制,而不是头的长度。

自定义请求头还能用 X- 前缀吗?

不推荐。RFC 6648 已劝退 X- 前缀:字段日后被标准化还得改名,反而制造兼容负担。推荐直接使用不带前缀的业务名。

冒号后面不加空格会被服务器拒绝吗?

规范要求冒号后有一个空格。多数服务器会宽容处理,但严格实现会直接判 400,而且不同代理层的宽容程度不一致。本页会单独列出「冒号后缺空格」的行。

同一个字段名能出现两次吗?

可以。请求侧同名头允许重复,服务端通常按逗号合并为一个逻辑值;真正不能乱用的是响应侧的 Set-Cookie,它有专门的多次出现语义。

这个工具免费吗?

免费,无需注册即可使用。

输入的数据安全吗?

安全。解析在当前浏览器本地完成,不会上传输入内容。

相关工具