Klient zbyt długo wysyłał żądanie.
Kiedy go używać
Bezczynne połączenia. Klient może bezpiecznie ponowić żądanie.
Typowe przyczyny i rozwiązania
Serwer zamknął połączenie, bo klient nie wysłał na czas kompletnego żądania. Typowe przyczyny: wolne sieci komórkowe przy przesyłaniu dużych plików, połączenia otwierane z wyprzedzeniem przez przeglądarki, które potem nic nie wysyłają, oraz połączenia keep-alive bezczynne dłużej, niż pozwala serwer. W nginx odpowiadają za to timery client_header_timeout i client_body_timeout, oba domyślnie 60 sekund.
Przeglądarki po cichu ponawiają żądanie, gdy bezczynne połączenie keep-alive zostanie zamknięte, więc użytkownicy rzadko widzą 408; zauważysz go głównie w logach dostępu, gdzie wpisy bez linii żądania pochodzą z preconnectów i są nieszkodliwe. Przy przesyłaniu dużych plików przez wolne łącza zwiększ client_body_timeout albo przejdź na przesyłanie w częściach z możliwością wznowienia. Klient może bezpiecznie ponowić żądanie, bo serwer nigdy go nie przetworzył.
Błąd klienta (4xx)
Kody 4xx to błędy klienta: samo żądanie jest błędne, nieautoryzowane albo wskazuje na coś, czego nie ma. Ponowienie tego samego żądania nic nie da.
Jak to wygląda
HTTP/1.1 408 Request TimeoutJak go wysłać
| Node.js / Express | res.status(408).end() |
|---|---|
| Python / Flask | return '', 408 |
| nginx | return 408; |
Jak go sprawdzić
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/