Le client a mis trop de temps à envoyer la requête.
Quand l’utiliser
Connexions inactives. Les clients peuvent réessayer sans risque.
Causes courantes et solutions
Le serveur a fermé la connexion parce que le client n’a pas envoyé de requête complète à temps. Causes courantes : des réseaux mobiles lents pendant de gros envois, des connexions ouvertes de manière spéculative par les navigateurs qui n’envoient ensuite rien, et des connexions keep-alive inactives au-delà de la limite du serveur. Dans nginx, les délais correspondants sont client_header_timeout et client_body_timeout, tous deux à 60 secondes par défaut.
Les navigateurs réessaient de manière transparente quand une connexion keep-alive inactive est fermée, donc les utilisateurs voient rarement un 408 ; on le remarque surtout dans les logs d’accès, où les entrées sans ligne de requête proviennent de préconnexions et sont sans danger. Pour les gros envois sur des liaisons lentes, augmentez client_body_timeout ou passez à des envois découpés et reprenables. Les clients peuvent réessayer sans risque, puisque le serveur n’a jamais traité la requête.
Erreur client (4xx)
Les codes 4xx sont des erreurs client : la requête elle-même est incorrecte, non autorisée ou vise quelque chose qui n’existe pas. Renvoyer la même requête ne servira à rien.
À quoi ça ressemble
HTTP/1.1 408 Request TimeoutComment l’envoyer
| Node.js / Express | res.status(408).end() |
|---|---|
| Python / Flask | return '', 408 |
| nginx | return 408; |
Comment le vérifier
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/