O cliente demorou demais para enviar a requisição.
Quando usar
Conexões ociosas. Os clientes podem tentar de novo com segurança.
Causas comuns e soluções
O servidor fechou a conexão porque o cliente não enviou uma requisição completa a tempo. Causas comuns: redes móveis lentas durante uploads grandes, conexões abertas especulativamente pelos navegadores que depois não enviam nada, e conexões keep-alive ociosas além do limite do servidor. No nginx, os timers são client_header_timeout e client_body_timeout, ambos de 60 segundos por padrão.
Os navegadores tentam de novo de forma transparente quando uma conexão keep-alive ociosa é fechada, então os usuários raramente veem o 408; você o nota principalmente nos logs de acesso, onde entradas sem linha de requisição vêm de preconnects e são inofensivas. Para uploads grandes em conexões lentas, aumente client_body_timeout ou mude para uploads em partes e retomáveis. Os clientes podem tentar de novo com segurança, já que o servidor nunca processou a requisição.
Erro do cliente (4xx)
Os códigos 4xx são erros do cliente: a própria requisição está errada, não está autorizada ou aponta para algo que não existe. Repetir a mesma requisição não vai adiantar.
Como fica
HTTP/1.1 408 Request TimeoutComo enviar
| Node.js / Express | res.status(408).end() |
|---|---|
| Python / Flask | return '', 408 |
| nginx | return 408; |
Como verificar
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/