ERR_HTTP2_PROTOCOL_ERROR: co oznacza i jak naprawić

Advertisement
Czym jest błąd ERR_HTTP2_PROTOCOL_ERROR?
ERR_HTTP2_PROTOCOL_ERROR to błąd Chrome i Edge, który oznacza, że przeglądarka otrzymała odpowiedź HTTP/2 łamiącą zasady protokołu. W Chromium to błąd sieciowy -337: „wystąpił błąd protokołu HTTP/2” (there is an HTTP/2 protocol error). Chrome nie ma dla niego osobnej strony błędu, więc widzisz ogólną: „Nie można uzyskać dostępu do tej witryny. Strona internetowa pod adresem … może być tymczasowo niedostępna lub została na stałe przeniesiona pod nowy adres”, a pod spodem ERR_HTTP2_PROTOCOL_ERROR.
HTTP/2 to szybsza wersja HTTP, z której korzysta dziś większość stron HTTPS. Jest bardziej rygorystyczna niż HTTP/1.1: odpowiedzi są dzielone na binarne ramki, nagłówki podlegają precyzyjnym zasadom, a zadeklarowany rozmiar odpowiedzi musi zgadzać się z tym, co faktycznie dociera. Gdy Chrome widzi odpowiedź łamiącą te zasady, na przykład urwaną w połowie strumienia albo z zakazanym nagłówkiem, traktuje całą odpowiedź jako zniekształconą i ją odrzuca.
Programiści często widzą ten błąd w konsoli DevTools jako net::ERR_HTTP2_PROTOCOL_ERROR 200 (OK). To połączenie jest mocną wskazówką: serwer odpowiedział kodem 200, ale treść odpowiedzi nigdy nie dotarła w całości.
Co HTTP/2 uznaje za zniekształconą odpowiedź
Standard HTTP/2 (RFC 9113) wymienia błędy, które sprawiają, że odpowiedź jest zniekształcona, a strumień zresetowany przed zakończeniem również kończy się niepowodzeniem. Oto problemy stojące za większością błędów spotykanych w praktyce:
| Zasada | Co ją łamie |
|---|---|
| Content-Length musi być równy rozmiarowi treści | Serwer lub wtyczka deklaruje jeden rozmiar, a wysyła inny, na przykład gdy dane wyjściowe są kompresowane już po ustawieniu długości |
| Odpowiedź musi zakończyć się poprawnie | Serwer, proxy lub aplikacja przestaje wysyłać dane w połowie |
| Brak nagłówków specyficznych dla połączenia | Connection, Keep-Alive, Proxy-Connection, Transfer-Encoding lub Upgrade wysłane w odpowiedzi HTTP/2 |
| Nazwy pól muszą być pisane małymi literami | Nazwy nagłówków z wielkimi literami przekazane bez zmian do HTTP/2 |
| Prawidłowe wartości nagłówków | Znaki nowej linii lub inne zakazane znaki w wartości nagłówka |
| Prawidłowa linia :status | Brakujący lub nieczytelny kod statusu |
Advertisement
Co powoduje błąd ERR_HTTP2_PROTOCOL_ERROR?
Większość przypadków ma źródło po stronie serwera, ale kilka rzeczy na Twoim komputerze również może uszkodzić odpowiedź w drodze do przeglądarki:
Po stronie serwera: odpowiedzi ucięte w połowie strumienia (proxy, któremu zabrakło miejsca na dysku albo nie może zapisać plików tymczasowych, aplikacja, która pada podczas strumieniowania, przekroczony limit czasu), błędne wartości Content-Length, zakazane lub nieprawidłowe nagłówki oraz błędna obsługa HTTP/2 w starszej konfiguracji serwera lub CDN.
Po Twojej stronie: antywirus lub zapora, które sprawdzają HTTPS i przepisują odpowiedzi, rozszerzenia przeglądarki modyfikujące żądania lub odpowiedzi, uszkodzona kopia strony w pamięci podręcznej, a czasem przestarzała wersja Chrome.
Rozwiązanie 1: Wymuś pełne odświeżenie i spróbuj trybu incognito
Naciśnij Ctrl + Shift + R (Mac: Cmd + Shift + R), aby odświeżyć stronę z pominięciem pamięci podręcznej. Odpowiedź, która raz została ucięta, przy następnej próbie może dotrzeć bez problemu.
Następnie otwórz stronę w oknie incognito (Ctrl + Shift + N, Mac Cmd + Shift + N). Tryb incognito nie ma plików cookie ani pamięci podręcznej z Twojego zwykłego profilu, a rozszerzenia są w nim domyślnie wyłączone. Jeśli strona się w nim ładuje, Rozwiązanie 2 lub Rozwiązanie 3 naprawi problem w zwykłym oknie.
Advertisement
Rozwiązanie 2: Wyczyść pamięć podręczną i pliki cookie tej strony
Uszkodzona kopia w pamięci podręcznej lub rozdęty plik cookie mogą wielokrotnie wywoływać ten błąd na jednej stronie. Wyczyść dane tylko tej strony: kliknij ikonę po lewej stronie paska adresu → Pliki cookie i dane witryn (lub Ustawienia witryny) → usuń dane, a potem odśwież. Aby wyczyścić więcej, naciśnij Ctrl + Shift + Delete i usuń Obrazy i pliki zapisane w pamięci podręcznej z ostatnich kilku dni.
Rozwiązanie 3: Wstrzymaj skanowanie HTTPS w antywirusie i rozszerzenia
Oprogramowanie zabezpieczające, które odszyfrowuje i sprawdza HTTPS, stoi pośrodku każdego połączenia HTTP/2. Jeśli jego obsługa HTTP/2 jest błędna lub przestarzała, może przekazywać odpowiedzi, które Chrome uznaje za zniekształcone. Wyłącz tylko funkcję skanowania HTTPS (zwykle nazywa się ona skanowanie HTTPS, Web Shield (osłona WWW), filtrowanie protokołu SSL/TLS albo skanowanie połączeń szyfrowanych) i odśwież stronę. Jeśli to pomoże, zaktualizuj antywirus i dodaj wyjątek dla tej strony.
Następnie wyłącz wszystkie rozszerzenia w chrome://extensions, odśwież stronę, a potem włączaj je z powrotem po jednym. Zwykle podejrzanymi są blokery reklam, narzędzia do ochrony prywatności i wszystko, co edytuje nagłówki.
Advertisement
Rozwiązanie 4: Zaktualizuj Chrome i sprawdź inne przeglądarki
Otwórz chrome://settings/help, aby zainstalować oczekującą aktualizację, a potem uruchom przeglądarkę ponownie. Następnie otwórz tę samą stronę w Firefoksie lub Safari. Jeśli nie działa nigdzie, strona jest uszkodzona i naprawić ją może tylko właściciel. Jeśli nie działa tylko w Chrome lub Edge, winna jest zwykle i tak strona, bo Chrome najsurowiej odrzuca zniekształcone HTTP/2, ale warto powtórzyć Rozwiązania 2 i 3.
Rozwiązanie 5: Przetestuj stronę bez HTTP/2
Chrome można uruchomić z wyłączonym HTTP/2, co daje pewność, czy to HTTP/2 jest problemem. Najpierw zamknij wszystkie okna Chrome, a potem uruchom przeglądarkę z terminala:
# Windows (wiersz polecenia)
"C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-http2
# macOS (Terminal)
open -a "Google Chrome" --args --disable-http2Jeśli w tym oknie strona się ładuje, odpowiedzi HTTP/2 tej strony są zniekształcone i musi je naprawić właściciel. Potem zamknij Chrome i otwórz go normalnie. Flaga działa tylko przy tym jednym uruchomieniu.
Advertisement
Dla właścicieli stron: jak naprawić błędy protokołu HTTP/2
Jeśli błąd zgłaszają odwiedzający z różnych sieci i przeglądarek, problem leży w Twojej infrastrukturze. Te trzy kontrole wykrywają prawie wszystkie przypadki.
1. Odtwórz błąd za pomocą curl
# HTTP/2: obserwuj koniec wyniku
curl -sv --http2 https://example.com/broken-page -o /dev/null
# Przerwany strumień kończy się czymś w rodzaju:
# HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)
# (curl 8.19+: HTTP/2 stream 1 reset by server (error 0x1 PROTOCOL_ERROR))
# Ten sam URL przez HTTP/1.1 dla porównania
curl -sv --http1.1 https://example.com/broken-page -o /dev/nullJeśli HTTP/1.1 działa, a HTTP/2 nie, błąd jest potwierdzony. Porównaj nagłówki odpowiedzi w obu przypadkach i zanotuj, ile bajtów dociera, zanim strumień się urwie. Narzędzie HTTP Headers pokazuje też nagłówki, które Twoja strona wysyła, widziane spoza Twojej sieci.
2. Sprawdź, czy odpowiedzi nie są ucinane w połowie strumienia
Najczęstszą przyczyną po stronie serwera jest odpowiedź, która się zaczyna (status 200, wysłane nagłówki), a potem kończy przedwcześnie. nginx buforuje większe odpowiedzi z Twojej aplikacji w plikach tymczasowych, a jeśli dysk jest pełny albo nginx nie może zapisywać w swoim katalogu tymczasowym, odpowiedź urywa się, a przeglądarka zgłasza błąd protokołu. Sprawdź:
df -h # czy któryś dysk jest pełny?
sudo grep -E "No space left|Permission denied" /var/log/nginx/error.log | tail
ls -ld /var/lib/nginx/proxy /var/lib/nginx/fastcgi # katalogi tymczasowe w Debian/Ubuntu; właściciel musi zgadzać się z użytkownikiem nginxSprawdź też samą aplikację: proces PHP lub Node, który pada, przekracza limit czasu albo limit pamięci podczas strumieniowania dużej strony lub pliku do pobrania, daje ten sam efekt. Logi aplikacji z okolic momentu wystąpienia błędu zwykle to pokazują.
3. Napraw Content-Length i zakazane nagłówki
Content-Length: pozwól serwerowi go obliczyć. Nie ustawiaj go ręcznie w kodzie aplikacji, jeśli wtyczka, middleware lub serwer WWW również kompresuje lub modyfikuje dane wyjściowe, bo wtedy zadeklarowana długość nie zgadza się już z wysłanymi bajtami. Na stronach WordPress dzieje się tak na przykład wtedy, gdy długość jest ustawiana w kodzie PHP, a wtyczka lub ustawienie PHP dodatkowo kompresuje dane wyjściowe.
Nagłówki specyficzne dla połączenia: usuń kod, który ustawia w odpowiedziach
Connection,Keep-Alive,Transfer-EncodinglubUpgrade. HTTP/2 ich zakazuje i choć nginx usuwa większość z nich za Ciebie, niektóre serwery aplikacji i proxy tego nie robią.Wartości nagłówków: upewnij się, że żaden nagłówek nie zawiera znaku nowej linii ani znaku sterującego. Często bierze się to z danych od użytkownika umieszczonych w nagłówku, na przykład nazwy pliku w
Content-Disposition.CDN przed serwerem: jeśli korzystasz z Cloudflare lub innego CDN, przetestuj serwer źródłowy bezpośrednio (za pomocą curl
--resolvelub wpisu w pliku hosts), aby ustalić, czy błąd pochodzi z serwera źródłowego, czy z CDN.
ERR_HTTP2_PROTOCOL_ERROR a podobne błędy
| Błąd | Kod | Co się stało |
|---|---|---|
| ERR_HTTP2_PROTOCOL_ERROR | -337 | Odpowiedź HTTP/2 złamała zasady protokołu |
| ERR_QUIC_PROTOCOL_ERROR | -356 | Ten sam rodzaj awarii, ale w HTTP/3 (QUIC) |
| ERR_SSL_PROTOCOL_ERROR | -107 | Uzgadnianie HTTPS (TLS) nie powiodło się, zanim zaczęło się HTTP/2 |
| ERR_CONNECTION_CLOSED | -100 | Połączenie zostało zamknięte, zanim dotarła strona |
| ERR_EMPTY_RESPONSE | -324 | Serwer nie wysłał w ogóle niczego |
Szczegółowe poradniki: ERR_QUIC_PROTOCOL_ERROR, ERR_SSL_PROTOCOL_ERROR, ERR_CONNECTION_CLOSED i ERR_EMPTY_RESPONSE. Aby sprawdzić certyfikat i konfigurację HTTPS strony z zewnątrz, użyj SSL Checker.
Zobacz nagłówki, które Twoja strona naprawdę wysyła
HTTP Headers Checker od DNS Robot pobiera dowolny adres URL z naszych serwerów i wyświetla kod statusu oraz każdy nagłówek odpowiedzi, dzięki czemu łatwo wychwycisz zakazane lub zniekształcone nagłówki.
Wypróbuj HTTP Headers CheckerAdvertisement
Często zadawane pytania
Oznacza, że Chrome otrzymał odpowiedź HTTP/2, która złamała zasady protokołu, na przykład skończyła się przedwcześnie, deklarowała błędny rozmiar albo zawierała zakazane nagłówki, więc ją odrzucił. W Chromium to błąd sieciowy -337.