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.
| Classe | 4xx, Erros do cliente |
|---|---|
| Definido em | RFC 6585 §5 |
| Pode ir para o cache por padrão | Não; a RFC 6585 proíbe caches de armazená-la |
| Pode repetir o pedido | Sim, depois de reduzir os cabeçalhos, o que quase sempre significa apagar os cookies do site |
| Cabeçalhos relevantes |
|
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.
# 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.jssrv := &http.Server{
Addr: ":8080",
Handler: mux,
MaxHeaderBytes: 64 << 10, // 64 KB; above this Go answers 431 on its own
}
log.Fatal(srv.ListenAndServe())# 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.