El cliente tardó demasiado en enviar la solicitud.
Cuándo usarlo
Conexiones inactivas. Los clientes pueden reintentar sin riesgo.
Causas habituales y soluciones
El servidor cerró la conexión porque el cliente no envió una solicitud completa a tiempo. Causas habituales: redes móviles lentas durante subidas grandes, conexiones que los navegadores abren de forma especulativa y por las que luego no envían nada, y conexiones keep-alive inactivas más allá del límite del servidor. En nginx, los temporizadores son client_header_timeout y client_body_timeout, ambos de 60 segundos por defecto.
Los navegadores reintentan de forma transparente cuando se cierra una conexión keep-alive inactiva, así que los usuarios rara vez ven un 408; sobre todo lo notarás en los logs de acceso, donde las entradas sin línea de solicitud vienen de preconexiones y son inofensivas. Para subidas grandes en conexiones lentas, aumenta client_body_timeout o pasa a subidas por fragmentos y reanudables. Los clientes pueden reintentar sin riesgo, ya que el servidor nunca procesó la solicitud.
Error del cliente (4xx)
Los códigos 4xx son errores del cliente: la solicitud en sí es incorrecta, no está autorizada o apunta a algo que no existe. Repetir la misma solicitud no servirá de nada.
Cómo se ve
HTTP/1.1 408 Request TimeoutCómo enviarlo
| Node.js / Express | res.status(408).end() |
|---|---|
| Python / Flask | return '', 408 |
| nginx | return 408; |
Cómo comprobarlo
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/