ERR_HTTP2_PROTOCOL_ERROR: Bedeutung und Lösung

Kernaussage

ERR_HTTP2_PROTOCOL_ERROR (Chromium-Fehler -337) bedeutet: Der HTTP/2-Stream, der die Seite transportiert, ist fehlgeschlagen. Entweder haben Server, Proxy oder CDN ihn mittendrin zurückgesetzt (Chrome meldet jeden solchen Reset als -337), oder Chrome hat Header abgelehnt, die gegen die Regeln von HTTP/2 verstoßen. Als Besucher kommen Sie mit Neuladen, einem Inkognito-Fenster, dem Löschen der Cookies der Website oder dem Pausieren des HTTPS-Scans im Antivirus manchmal weiter, meist kann aber nur die Website selbst das beheben. Bei Website-Betreibern sind die üblichen Ursachen eine Antwort, die Server oder Proxy nicht zu Ende senden konnten (volle Festplatte, nicht beschreibbarer Temp-Ordner, abstürzende App), ein Content-Length, der nicht zum Body passt, oder ein verbotener Header wie Transfer-Encoding. Reproduzieren Sie den Fehler mit curl --http2 -v.

Jetzt prüfen

Chrome-Fehlerseite mit ERR_HTTP2_PROTOCOL_ERROR neben den Prüfungen, die HTTP/2-Protokollfehler beheben
Chrome-Fehlerseite mit ERR_HTTP2_PROTOCOL_ERROR neben den Prüfungen, die HTTP/2-Protokollfehler beheben
Jetzt lesen
  1. Was ist ERR_HTTP2_PROTOCOL_ERROR?
  2. Was HTTP/2 als fehlerhaft behandelt
  3. Was verursacht ERR_HTTP2_PROTOCOL_ERROR?
  4. Lösung 1: Hartes Neuladen und Inkognito testen
  5. Lösung 2: Cookies und Cache dieser Website löschen
  6. Lösung 3: HTTPS-Scan des Antivirus und Erweiterungen pausieren
  7. Lösung 4: Chrome aktualisieren und andere Browser testen
  8. Lösung 5: Die Seite ohne HTTP/2 testen
  9. Für Website-Betreiber: HTTP/2-Protokollfehler beheben
  10. 1. Mit curl reproduzieren
  11. 2. Nach mittendrin abgeschnittenen Antworten suchen
  12. 3. Content-Length und verbotene Header korrigieren
  13. ERR_HTTP2_PROTOCOL_ERROR vs. ähnliche Fehler
  14. Häufig gestellte Fragen

Was ist ERR_HTTP2_PROTOCOL_ERROR?

ERR_HTTP2_PROTOCOL_ERROR ist ein Fehler in Chrome und Edge und bedeutet, dass der HTTP/2-Stream, der die Seite transportiert, fehlgeschlagen ist: Der Server hat ihn vor dem Ende zurückgesetzt oder Header gesendet, die der Browser ablehnt. In Chromium ist das der Netzwerkfehler -337: „There is an HTTP/2 protocol error“ (net_error_list.h). Chrome hat dafür keine eigene Fehlerseite, Sie sehen also die allgemeine: „Diese Website ist nicht erreichbar. Die Webseite unter … ist möglicherweise vorübergehend nicht verfügbar oder wurde dauerhaft an eine neue Webadresse verschoben.“ Darunter steht ERR_HTTP2_PROTOCOL_ERROR. Edge zeigt denselben Code auf seiner eigenen Fehlerseite.

HTTP/2 ist die schnellere HTTP-Version, die heute die meisten HTTPS-Seiten nutzen. Jede Anfrage läuft als eigener Stream innerhalb einer einzigen Verbindung, und jede Seite kann einen Stream mit einem Reset abbrechen. Chrome meldet jeden Reset vom Server als Protokollfehler, egal aus welchem Grund der Server ihn gesendet hat. Außerdem bricht Chrome einen Stream selbst ab, wenn die Header gegen die Regeln von HTTP/2 verstoßen (ein Transfer-Encoding-Header, Großbuchstaben in einem Header-Namen, ein fehlender Status).

Entwickler sehen den Fehler oft in der DevTools-Konsole als net::ERR_HTTP2_PROTOCOL_ERROR 200 (OK). Diese Kombination ist ein starker Hinweis: Die Header waren gültig und der Server hat mit 200 geantwortet, aber der Stream ist gescheitert, während der Body noch ankam.

Sehen Sie, welche Header eine Seite wirklich sendet

Was HTTP/2 als fehlerhaft behandelt

Der HTTP/2-Standard (RFC 9113) listet die Fehler auf, die eine Antwort ungültig machen. Hinter den meisten Fehlern in der Praxis stecken diese Probleme, und so kommt jedes davon im Browser an:

RegelWas dagegen verstößt
Content-Length muss der Größe des Bodys entsprechenEin Server oder Plugin kündigt eine Größe an und sendet eine andere. Proxy, CDN oder Server davor setzen den Stream dann zurück
Die Antwort muss sauber endenServer, Proxy oder App können die Antwort nicht beenden (volle Festplatte, Absturz, Timeout) und setzen den Stream zurück. nginx tut das, wenn es eine begonnene Antwort nicht abschließen kann
Keine verbindungsspezifischen HeaderTransfer-Encoding in einer HTTP/2-Antwort (Chrome lehnt sie ab). Auch Connection, Keep-Alive, Proxy-Connection und Upgrade sind verboten, und strenge Clients wie curl lehnen sie ab
Header-Namen müssen kleingeschrieben seinHeader-Namen mit Großbuchstaben, die direkt an HTTP/2 durchgereicht werden
Gültige Header-WerteZeilenumbrüche oder andere verbotene Zeichen in einem Header-Wert
Ein gültiger :status-Pseudo-HeaderEin fehlender oder unlesbarer Statuscode

Was verursacht ERR_HTTP2_PROTOCOL_ERROR?

Die meisten Fälle kommen von der Serverseite, aber ein paar Dinge auf Ihrem eigenen Computer können eine Antwort auf dem Weg zu Ihnen beschädigen:

  • Am Server: eine Antwort, die Server oder Proxy nicht zu Ende senden können (ein Proxy, dem der Speicherplatz ausgeht oder der seine Temp-Dateien nicht schreiben kann, eine App, die beim Streamen abstürzt, ein Timeout), falsche Content-Length-Werte, bei denen der vorgeschaltete Proxy aufgibt, verbotene oder ungültige Header und fehlerhafte HTTP/2-Unterstützung in einer älteren Server- oder CDN-Konfiguration.
  • Auf Ihrer Seite: Antivirus- oder Firewall-Software, die HTTPS prüft und den Datenverkehr umschreibt, Browser-Erweiterungen, die Anfragen oder Antworten verändern, eine Anfrage, die der Server falsch verarbeitet (zum Beispiel übergroße Cookies), und gelegentlich eine veraltete Chrome-Version.

Lösung 1: Hartes Neuladen und Inkognito testen

Drücken Sie Strg + Umschalt + R (Mac: Cmd + Umschalt + R), um ohne Cache neu zu laden. Eine Antwort, die einmal abgeschnitten wurde, kommt beim nächsten Versuch womöglich vollständig an.

Öffnen Sie die Seite dann in einem Inkognito-Fenster (Strg + Umschalt + N, Mac Cmd + Umschalt + N). Inkognito hat keine Cookies, keinen Cache aus Ihrem normalen Profil, und Erweiterungen sind standardmäßig aus. Lädt die Seite dort, lösen Lösung 2 oder Lösung 3 das Problem in Ihrem normalen Fenster.

Lösung 2: Cookies und Cache dieser Website löschen

Das Löschen von Cookies und Cache der Website ändert die Anfrage, die Chrome sendet (weniger Cookies, keine zwischengespeicherte Kopie, die erneut geprüft werden muss), und das kann einen Serverfehler umgehen. Klicken Sie links in der Adressleiste auf Website-Informationen anzeigen → Cookies und Websitedaten → Websitedaten auf dem Gerät verwalten → löschen und neu laden. Für eine gründlichere Bereinigung drücken Sie Strg + Umschalt + Entf und löschen Bilder und Dateien im Cache für den Zeitraum Letzte 7 Tage.

Lösung 3: HTTPS-Scan des Antivirus und Erweiterungen pausieren

Sicherheitssoftware, die HTTPS entschlüsselt und prüft, sitzt mitten in jeder HTTP/2-Verbindung. Ist ihre HTTP/2-Verarbeitung fehlerhaft oder veraltet, kann sie Streams beschädigen oder Header weiterreichen, die Chrome ablehnt. Schalten Sie nur die HTTPS-Scan-Funktion aus (Avast/AVG: Web-Schutz → Enable HTTPS scanning; ESET: SSL/TLS-Protokollfilterung; Kaspersky: Verschlüsselte Verbindungen scannen) und laden Sie neu. Behebt das den Fehler, aktualisieren Sie das Antivirenprogramm und richten Sie eine Ausnahme für die Website ein.

Deaktivieren Sie als Nächstes alle Erweiterungen unter chrome://extensions, laden Sie neu und schalten Sie sie dann nacheinander wieder ein. Werbeblocker, Datenschutz-Tools und alles, was Header bearbeitet, sind die üblichen Verdächtigen.

Lösung 4: Chrome aktualisieren und andere Browser testen

Öffnen Sie chrome://settings/help, um ausstehende Updates zu installieren, und starten Sie den Browser neu. Öffnen Sie dann dieselbe Seite in Firefox oder Safari sowie auf einem anderen Gerät oder in einem anderen Netzwerk. Scheitert sie überall, ist die Website kaputt, und nur ihr Betreiber kann das beheben (der HTTPS-Scan eines Antivirus betrifft jeden Browser auf einem Computer, ein zweites Gerät ist also der eigentliche Test). Scheitern nur Chrome oder Edge, sendet die Website wahrscheinlich einen Header, den Chrome ablehnt; Lösung 2 und 3 lohnen trotzdem einen zweiten Versuch.

Lösung 5: Die Seite ohne HTTP/2 testen

Chrome lässt sich mit ausgeschaltetem HTTP/2 (und HTTP/3) starten. So sehen Sie, ob HTTP/2 beteiligt ist. Starten Sie aus einem Terminal ein zweites, separates Chrome; der zusätzliche Profilordner macht es zu einer neuen Instanz, auch wenn Ihr normales Chrome offen ist:

bash
# Windows (Command Prompt)
"C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="%TEMP%\h2test" --disable-http2 --disable-quic

# macOS (Terminal)
open -na "Google Chrome" --args --user-data-dir=/tmp/h2test --disable-http2 --disable-quic

Lädt die Seite in diesem Fenster, sind die HTTP/2-Antworten der Website das Problem, und der Betreiber muss sie beheben. Scheitert sie jetzt mit ERR_CONTENT_LENGTH_MISMATCH oder ERR_INCOMPLETE_CHUNKED_ENCODING, schneidet der Server die Antwort unabhängig vom Protokoll ab. Schließen Sie das Fenster danach; Ihr normales Chrome bleibt unberührt.

Für Website-Betreiber: HTTP/2-Protokollfehler beheben

Melden Besucher aus verschiedenen Netzwerken und Browsern den Fehler, liegt das Problem in Ihrem Stack. Diese drei Prüfungen finden fast alle Ursachen.

1. Mit curl reproduzieren

bash
# HTTP/2: watch the end of the output
curl -sv --http2 https://example.com/broken-page -o /dev/null
# A stream the server gave up on ends with something like:
# HTTP/2 stream 1 was not closed cleanly: INTERNAL_ERROR (err 2)
# (curl 8.19+: HTTP/2 stream 1 reset by server (error 0x2 INTERNAL_ERROR);
#  "reset by curl" means curl rejected the response itself)

# Same URL over HTTP/1.1 for comparison
curl -sv --http1.1 https://example.com/broken-page -o /dev/null

Funktioniert HTTP/1.1 und scheitert HTTP/2, ist HTTP/2 beteiligt. „Reset by server“ weist darauf hin, dass der Server oder ein Proxy mitten in der Antwort aufgegeben hat. curl prüft nicht genau dasselbe wie Chrome (es lehnt Content-Length-Abweichungen und verbindungsspezifische Header ab, die Chrome durchlässt), betrachten Sie es also als starken Hinweis, nicht als Beweis. Der HTTP-Headers-Checker listet die Header auf, die Ihre App setzt, von außerhalb Ihres Netzwerks gesehen.

2. Nach mittendrin abgeschnittenen Antworten suchen

Die häufigste Ursache auf Serverseite ist eine Antwort, die beginnt (Status 200, Header gesendet) und dann nicht zu Ende gebracht werden kann. nginx puffert größere Antworten Ihrer App in temporären Dateien. Ist die Festplatte voll oder kann nginx nicht in seinen Temp-Ordner schreiben, setzt es den Stream zurück, und der Browser meldet einen Protokollfehler. Prüfen Sie:

bash
df -h                                   # is any disk full?
sudo grep -E "No space left|Permission denied" /var/log/nginx/error.log | tail
ls -ld /var/lib/nginx/proxy /var/lib/nginx/fastcgi   # Debian/Ubuntu packages
ls -ld /var/cache/nginx/proxy_temp /var/cache/nginx/fastcgi_temp   # nginx.org packages
# the temp folders must be writable by the nginx worker user

Prüfen Sie auch die App selbst: Ein PHP- oder Node-Prozess, der beim Streamen einer großen Seite oder eines Downloads abstürzt, in ein Timeout läuft oder ein Speicherlimit erreicht, führt zum selben Ergebnis. Die App-Logs rund um den Zeitpunkt des Fehlers zeigen das meist.

3. Content-Length und verbotene Header korrigieren

  • Content-Length: Lassen Sie den Server ihn berechnen. Setzen Sie ihn nicht von Hand im App-Code, wenn ein Plugin, eine Middleware oder der Webserver die Ausgabe zusätzlich komprimiert oder verändert, denn dann passt die angekündigte Länge nicht mehr zu den gesendeten Bytes. Eine im PHP-Code gesetzte Länge, während ein Plugin oder eine PHP-Einstellung die Ausgabe ebenfalls komprimiert, ist ein Weg, wie das auf WordPress-Seiten passiert.
  • Transfer-Encoding: Senden Sie ihn nie in einer HTTP/2-Antwort; Chrome setzt den Stream zurück, sobald es einen sieht. RFC 9113 verbietet außerdem Connection, Keep-Alive, Proxy-Connection und Upgrade. Chrome ignoriert diese, curl und andere strenge Clients lehnen sie aber ab, und nginx entfernt die meisten davon aus weitergeleiteten Antworten für Sie.
  • Header-Werte: Stellen Sie sicher, dass kein Header einen Zeilenumbruch oder ein Steuerzeichen enthält. Das kommt oft von Nutzereingaben, die in einem Header landen, etwa ein Dateiname in Content-Disposition.
  • Vorgeschaltetes CDN: Nutzen Sie Cloudflare oder ein anderes CDN, testen Sie den Origin-Server direkt (mit curl --resolve oder einem hosts-Eintrag), um herauszufinden, ob der Fehler vom Origin oder vom CDN kommt.

ERR_HTTP2_PROTOCOL_ERROR vs. ähnliche Fehler

FehlerCodeWas passiert ist
ERR_HTTP2_PROTOCOL_ERROR-337Eine HTTP/2-Antwort hat gegen die Protokollregeln verstoßen
ERR_QUIC_PROTOCOL_ERROR-356Dieselbe Art von Fehler über HTTP/3 (QUIC)
ERR_SSL_PROTOCOL_ERROR-107Der HTTPS-Handshake (TLS) ist gescheitert, bevor HTTP/2 begann
ERR_CONNECTION_CLOSED-100Die Verbindung wurde geschlossen, bevor eine Seite ankam
ERR_EMPTY_RESPONSE-324Der Server hat überhaupt nichts gesendet

Ausführliche Anleitungen: ERR_QUIC_PROTOCOL_ERROR, ERR_SSL_PROTOCOL_ERROR, ERR_CONNECTION_CLOSED und ERR_EMPTY_RESPONSE. Um das Zertifikat und die HTTPS-Einrichtung einer Website von außen zu prüfen, nutzen Sie den SSL-Checker.

Sehen Sie, welche Header Ihre Website wirklich sendet

Der HTTP-Headers-Checker von DNS Robot ruft jede URL von unseren Servern aus über HTTP/1.1 ab und listet den Statuscode und jeden Response-Header auf, den Ihre App setzt (Content-Length, Content-Encoding, Content-Disposition). So können Sie sie mit der Ausgabe von curl --http2 vergleichen.

Quellen

  1. net_error_list.h (HTTP2_PROTOCOL_ERROR -337), Chromium
  2. RFC 9113: HTTP/2, fehlerhafte Nachrichten, IETF
  3. HTTP/2: ERR_HTTP2_PROTOCOL_ERROR, Cloudflare

Häufig gestellte Fragen

Was bedeutet ERR_HTTP2_PROTOCOL_ERROR?

Der HTTP/2-Stream, der die Seite transportiert, ist fehlgeschlagen. Meist haben Server, Proxy oder CDN ihn zurückgesetzt, bevor die Antwort fertig war, und Chrome meldet das als Protokollfehler; manchmal hat Chrome Header abgelehnt, die HTTP/2 verbietet, etwa Transfer-Encoding. In Chromium ist das der Netzwerkfehler -337.

Liegt ERR_HTTP2_PROTOCOL_ERROR an mir oder an der Website?

Meist an der Website. Auch der HTTPS-Scan des Antivirus, Browser-Erweiterungen oder übergroße Cookies können ihn auslösen. Probieren Sie also zuerst hartes Neuladen, ein Inkognito-Fenster und das Pausieren des HTTPS-Scans. Scheitert die Seite in jedem Browser und in jedem Netzwerk, kann nur der Betreiber das Problem beheben.

Was bedeutet net::ERR_HTTP2_PROTOCOL_ERROR 200?

Die Header waren gültig und der Server hat mit 200 geantwortet, aber der Stream ist gescheitert, während der Body noch ankam: Server, Proxy oder CDN haben ihn mittendrin zurückgesetzt. Die üblichen Ursachen sind ein Proxy, dem der Speicherplatz ausging oder der keine Temp-Dateien schreiben konnte, eine App, die mitten in der Antwort abstürzte, oder ein Content-Length, der nicht zum Body passt.

Wie behebe ich ERR_HTTP2_PROTOCOL_ERROR in Chrome?

Laden Sie mit Strg + Umschalt + R hart neu, testen Sie Inkognito, löschen Sie Cookies und Cache der Website, pausieren Sie den HTTPS-Scan des Antivirus, deaktivieren Sie Erweiterungen und aktualisieren Sie Chrome. Um zu prüfen, ob HTTP/2 beteiligt ist, starten Sie ein separates Chrome mit --user-data-dir, --disable-http2 und --disable-quic und sehen Sie nach, ob die Seite lädt.

Kann ich HTTP/2 in Chrome deaktivieren?

Nicht über die Einstellungen. Zum Testen können Sie ein separates Chrome mit --disable-http2 und --disable-quic starten (zusammen mit --user-data-dir, sonst ignoriert ein laufendes Chrome die Flags). Es gilt nur für diesen einen Start. Das ist ein Diagnosewerkzeug, keine dauerhafte Lösung, denn HTTP/2 macht Websites schneller.

Warum tritt ERR_HTTP2_PROTOCOL_ERROR auf meiner nginx-Website auf?

Prüfen Sie, ob die Festplatte voll ist oder nginx nicht in seine Proxy- oder FastCGI-Temp-Ordner schreiben kann (suchen Sie im Error-Log nach „No space left on device“ oder „Permission denied“), ob die App mitten in der Antwort abstürzt und ob Ihre App einen Transfer-Encoding-Header oder ein falsches Content-Length sendet. Reproduzieren Sie den Fehler mit curl --http2 -v.

Kann Cloudflare ERR_HTTP2_PROTOCOL_ERROR verursachen?

Meist liegt der Fehler beim Origin. Die Cloudflare-Dokumentation nennt fehlerhafte Origin-Header und Komprimierungsprobleme (ein gzip-Body, dessen Content-Length nicht aktualisiert wurde, oder defektes gzip) als übliche Ursachen, und sie zeigen sich womöglich nur, wenn der Datenverkehr über Cloudflare läuft. Testen Sie den Origin direkt, an Cloudflare vorbei.

Was ist der Unterschied zwischen ERR_HTTP2_PROTOCOL_ERROR und ERR_QUIC_PROTOCOL_ERROR?

Es ist dieselbe Art von Fehler in verschiedenen Protokollen. ERR_HTTP2_PROTOCOL_ERROR tritt über HTTP/2 (auf TCP) auf, ERR_QUIC_PROTOCOL_ERROR über HTTP/3 (auf QUIC). Firewalls und Antivirenprogramme, die QUIC stören, sind eine häufige zusätzliche Ursache für den zweiten.

Behebt das Leeren des Caches ERR_HTTP2_PROTOCOL_ERROR?

Manchmal. Das Löschen von Cookies und Cache der Website ändert die Anfrage, die Chrome sendet, und kann so einen Serverfehler umgehen. Der Versuch lohnt sich also. Setzt der Server den Stream weiter zurück oder sendet er weiter fehlerhafte Header, kommt der Fehler zurück, bis die Website repariert ist.

Über den Autor

Shaik Vahid

Gründer von DNS Robot. Vahid hat jahrelang im Webhosting-Support Domains, DNS-Einträge, SSL-Zertifikate und E-Mail-Zustellung für Kunden in Ordnung gebracht. Er entwickelt die Tools von DNS Robot und schreibt diese Anleitungen über die Fehler, die Menschen wirklich sehen.

HTTP-Header-Checker

HTTP-Antwort-Header und Sicherheits-Header-Bewertung analysieren