Skip to content

Código de status HTTP · Erros do cliente (4xx)

Erro 431 Request Header Fields Too Large

O erro 431 Request Header Fields Too Large significa que o servidor recusou o pedido porque os cabeçalhos, somados ou um deles sozinho, passam do tamanho aceito. A causa clássica são os cookies: muitos cookies, ou um cookie de sessão ou rastreamento gigante, enviados em todo pedido ao domínio.

Dados sobre este código de status
Classe4xx, Erros do cliente
Definido emRFC 6585 §5
Pode ir para o cache por padrãoNão; a RFC 6585 proíbe caches de armazená-la
Pode repetir o pedidoSim, depois de reduzir os cabeçalhos, o que quase sempre significa apagar os cookies do site
Cabeçalhos relevantes
  • Cookie: o culpado de sempre: todos os cookies do domínio vão em todo pedido
  • Authorization: JWTs grandes, com muitas claims, podem estourar o limite num cabeçalho só

O que significa o 431

A RFC 6585, seção 5, permite o 431 tanto para o bloco de cabeçalhos inteiro quanto para um campo isolado, e pede que o servidor diga qual campo estourou nesse segundo caso. Os limites variam muito. O Node.js recusa cabeçalhos acima de 16 KB por padrão e responde 431 sozinho. O Go aceita até 1 MB (http.DefaultMaxHeaderBytes) e também responde 431.

O nginx é uma exceção importante: quando uma linha de cabeçalho não cabe num dos buffers de large_client_header_buffers (4 buffers de 8 KB por padrão), ele responde 400 "Request Header Or Cookie Too Large", não 431. O mesmo cookie pode dar 400 num servidor e 431 em outro.

No desenvolvimento local, o gatilho típico é o localhost: todo projeto que você rodou em localhost:3000 deixou cookies lá, e todos voltam em cada pedido.

Causas comuns

Se você está visitando o site

  • Cookies do site acumulados com o tempo, de analytics, testes A/B, widgets de chat e sessões antigas.
  • Uma extensão que injeta cabeçalhos extras em todo pedido.

Se você administra o servidor

  • Guardar dados de sessão ou um JWT grande em cookie, em vez de um ID de sessão curto.
  • Cookies definidos no domínio pai (.exemplo.com) que todo subdomínio recebe, mesmo os que nunca leem esses cookies.
  • Uma cadeia de proxies que vai acrescentando ao X-Forwarded-For ou adiciona cabeçalhos de tracing a cada salto.
  • Referer muito longo ou cabeçalhos próprios carregando estado codificado.

Como resolver

Se você está visitando o site

  • Apague os cookies só daquele site: no Chrome, clique no ícone à esquerda do endereço, depois em Cookies e dados do site, e remova. Depois recarregue.
  • Teste numa janela anônima; se funcionar lá, o problema eram os cookies.

Se você administra o servidor

  • Mantenha os cookies pequenos: guarde um ID de sessão e busque o resto no servidor; restrinja o cookie ao host e caminho que precisam dele.
  • No localhost, apague os cookies de localhost ou rode cada projeto num hostname ou porta própria.
  • Se precisar mesmo de cabeçalhos maiores, aumente o limite: node --max-http-header-size=32768, http.Server{MaxHeaderBytes} no Go, large_client_header_buffers 4 32k no nginx. Cada proxy da cadeia precisa da mesma folga.

Como enviar um 431

É raro mandar 431 de dentro de um handler. O servidor HTTP recusa o pedido antes do seu código rodar, então o que importa são os limites de tamanho de cabeçalho mostrados aqui.

Terminal
# Reproduce: a 20 KB cookie is over Node.js's 16 KB default
curl -i http://localhost:3000/ -H "Cookie: big=$(head -c 20000 /dev/zero | tr '\0' a)"
# HTTP/1.1 431 Request Header Fields Too Large

# Raise the limit (bytes) only if you really need bigger headers
node --max-http-header-size=32768 server.js
Go net/http
srv := &http.Server{
	Addr:           ":8080",
	Handler:        mux,
	MaxHeaderBytes: 64 << 10, // 64 KB; above this Go answers 431 on its own
}
log.Fatal(srv.ListenAndServe())
Nginx
# nginx answers 400 "Request Header Or Cookie Too Large", not 431,
# when one header line does not fit a buffer. Default: 4 8k.
large_client_header_buffers 4 32k;

Costuma ser confundido com

431 vs 413
O 413 é sobre o corpo do pedido (upload grande demais); o 431 é sobre os cabeçalhos, que os cookies incham.
431 vs 414
O 414 indica URL longa demais na linha do pedido; o 431 indica cabeçalhos grandes demais depois dela.
431 vs 400
O nginx reporta cabeçalhos grandes demais como 400 "Request Header Or Cookie Too Large"; Node.js e Go reportam a mesma situação como 431.

Perguntas frequentes

Como resolver o erro 431 no Chrome?
Apague os cookies só daquele site (configurações do site, Cookies e dados do site) e recarregue. Se acontece no localhost durante o desenvolvimento, apague os cookies de localhost, que se acumulam de todos os projetos que você rodou ali.
Qual o limite de tamanho de cabeçalho no Node.js?
16 KB para todos os cabeçalhos do pedido somados, por padrão. Dá para aumentar com a flag --max-http-header-size ou a opção maxHeaderSize do http.createServer, mas enxugar os cookies é a correção melhor.
Por que o nginx mostra 400 em vez de 431?
O nginx responde 400 "Request Header Or Cookie Too Large" quando um cabeçalho não cabe nos buffers de large_client_header_buffers, em vez de usar o 431 da RFC 6585. É o mesmo problema com outro código.

Revisado em por Arielton Oberek.