HTTPQUERY
English

431 Request Header Fields Too Large

用法

431 Request Header Fields Too Large 状态码表示服务器拒绝处理该 HTTP 请求,因为 HTTP 头部指定的数据过多。

视服务器而定,这可能指所有 HTTP 头部合计的总长度,也可能指某些特定头部。无论哪种情况,客户端都可以选择移除一个或多个 HTTP 头部后重试请求。限制 HTTP 头部数量的一种可行方案是削减或减少所传输的 Cookie。

SEO 影响

像 Google 这样的搜索引擎不会索引返回 431 状态的 URL。过去已被索引但返回此状态码的 URL 会从搜索结果中移除。

示例

客户端请求某个资源,服务器返回 431 Request Header Fields Too Large,因为两个较大 Cookie 值加在一起超过了服务器为 HTTP 头部设置的最大限制。

请求

GET /tech-news HTTP/1.1
Host: example.com
Cookie: first_cookie=<very_long>; second_cookie=<long_again>

响应

HTTP/1.1 431 Request Header Fields Too Large
Content-Type: text/html
Content-Length: 183

<html>
  <head>
    <title>Request Headers Too Long</title>
  </head>
  <body>
   <p>The request headers are too long.
   Try retrying without cookies.</p>
  </body>
</html>

如何修复

在浏览器中清除受影响域名的 Cookie。Cookie 累积是最常见的原因。第三方脚本、分析标签和营销像素会在每次访问时设置 Cookie,其合计大小最终会超过服务器限制。在做全面清除浏览器 Cookie 之前,先清除特定站点的 Cookie。

减少随请求发送的自定义头部值。较长的授权令牌、过大的 X-Custom-* 头以及嵌入头部中的 URL 编码查询参数都会增加总大小。

在服务器端,提高头部缓冲区限制:

在站点范围内审计 Cookie 使用情况。限制每个域名设置的 Cookie 数量,并使用 SameSite、Path 和 Domain 属性防止 Cookie 传播到不需要它们的子域名和路径。当数据不需要随每个请求一起传输时,将会话数据移至服务器端存储或 localStorage。

将服务器限制提高到 32 KB 以上会引入拒绝服务(DoS)风险。仅将限制提高到足以容纳正常流量的程度,并将该更改与请求大小监控结合起来。

Chrome 与 431 错误

当某个域名累积的 Cookie 使请求头部超过服务器限制时,Chrome 会显示 “Bad Request - Request Header Field Too Long” 或 “Bad message 431”。在 Chrome 设置中清除该特定站点的 Cookie(设置 > 隐私 > Cookie > 查看所有站点数据)可立即解决错误,且不影响其他站点。

代码参考

.NET

HttpStatusCode.RequestHeaderFieldsTooLarge

Rust

http::StatusCode::REQUEST_HEADER_FIELDS_TOO_LARGE

Rails

:request_header_fields_too_large

Go

http.StatusRequestHeaderFieldsTooLarge

Symfony

Response::HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE

Python3.5+

http.HTTPStatus.REQUEST_HEADER_FIELDS_TOO_LARGE

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_REQUEST_HEADER_FIELDS_TOO_LARGE

Angular

@angular/common/http/HttpStatusCode.RequestHeaderFieldsTooLarge