wake-up-neo.net

Worum geht es im net :: ERR_HTTP2_PROTOCOL_ERROR?

Ich arbeite derzeit an einer Website, die in Google Chrome einen net::ERR_HTTP2_PROTOCOL_ERROR 200 - Fehler auslöst. Ich bin mir nicht sicher, was genau diesen Fehler hervorrufen kann. Ich habe nur bemerkt, dass er nur beim Zugriff auf die Website in HTTPS angezeigt wird. Ich kann nicht 100% sicher sein, dass es verwandt ist, aber es sieht so aus, als würde es verhindern, dass Javascript ordnungsgemäß ausgeführt wird.

Das folgende Szenario tritt beispielsweise auf:

  1. Ich greife in HTTPS auf die Website zu

  2. Mein über https://publish.Twitter.com integrierter Twitter-Feed wird überhaupt nicht geladen

  3. Ich kann in der Konsole den ERR_HTTP2_PROTOCOL_ERROR feststellen

  4. Wenn ich den Code zum Laden des Twitter-Feeds entferne, bleibt der Fehler bestehen

  5. Wenn ich über HTTP auf die Website zugreife, wird der Twitter-Feed angezeigt und der Fehler verschwindet

Google Chrome ist der einzige Webbrowser, der den Fehler auslöst: Er funktioniert sowohl unter Edge als auch unter Firefox. (Hinweis: Ich habe es mit Safari versucht und habe einen ähnlichen kcferrordomaincfnetwork 303 Fehler.)

Ich habe mich gefragt, ob dies mit dem vom Server zurückgegebenen Header zusammenhängen könnte, da der Fehler diese '200'-Erwähnung enthält und eine 404/500-Seite nichts auslöst.

Die Sache ist, dass der Fehler überhaupt nicht dokumentiert ist. Die Google-Suche liefert mir nur sehr wenige Ergebnisse. Außerdem habe ich festgestellt, dass es in den neuesten Google Chrome -Versionen; der Fehler tritt nicht in Version 64.X auf, aber in Version 75 + (unabhängig vom Betriebssystem; ich) arbeite an Mac tho).

Jeder Hinweis an dieser Stelle zu untersuchen wäre gerne dankbar!

Danke im Voraus.

Tristan


Edit 1 : Könnte mit Website OK in Firefox zusammenhängen, aber nicht in Safari (kCFErrorDomainCFNetwork-Fehler 303) weder Chrome (net: : ERR_SPDY_PROTOCOL_ERROR)


Edit 2 : Ergebnisse weiterer Untersuchungen sind folgende:

  • Fehler wird nicht auf genau derselben Seite angezeigt, wenn der Server 404 anstelle von 2XX zurückgibt
  • der Fehler tritt nicht lokal mit einem HTTPS-Zertifikat auf
  • der Fehler tritt auf einem anderen Server auf (beide sind OVHs), der ein anderes Zertifikat verwendet
  • fehler tritt auf, egal was PHP Version wird verwendet, von 5.6 bis 7.3 (verwendetes Framework: Cakephp 2.10)

Edit 3 : Wie angefordert, ist unten der zurückgegebene Header für die fehlerhafte Ressource, die die gesamte Webseite darstellt. Selbst wenn der Fehler auf jeder Seite mit einem HTTP-Header 200 ausgelöst wird, werden diese Seiten immer im Browser des Clients geladen, aber manchmal fehlt ein Element (in meinem Beispiel der externe Twitter-Feed). Jedes andere Asset auf der Registerkarte Netzwerk hat eine Erfolgsrendite, mit Ausnahme des gesamten Dokuments. line that failed in console

Google Chrome Header (mit Fehler)):

Chrome header

Firefox-Header (ohne Fehler):

Firefox header

Eine curl --head --http2 - Anforderung in der Konsole gibt den folgenden Erfolg zurück:

HTTP/2 200 
date: Fri, 04 Oct 2019 08:04:51 GMT
content-type: text/html; charset=UTF-8
content-length: 127089
set-cookie: SERVERID31396=2341116; path=/; max-age=900
server: Apache
x-powered-by: PHP/7.2
set-cookie: xxxxx=0919c5563fc87d601ab99e2f85d4217d; expires=Fri, 04-Oct-2019 12:04:51 GMT; Max-Age=14400; path=/; secure; HttpOnly
vary: Accept-Encoding

Edit 4 : Versucht, mit dem Chrome tiefer zu gehen: // net-export/und https://netlog-viewer.appspot.com tools sagt mir, dass die Anfrage mit einem RST_STREAM endet:

t=123354 [st=5170]    HTTP2_SESSION_RECV_RST_STREAM
                      --> error_code = "2 (INTERNAL_ERROR)"
                      --> stream_id = 1

Für das, was ich in diesem anderen Beitrag gelesen habe, " Wenn der Client in HTTP/2 die Anforderung abbrechen möchte, sendet er ein RST_STREAM. Wenn der Server ein empfängt RST_STREAM beendet das Senden von DATA-Frames an den Client, wodurch die Antwort (oder der Download) gestoppt wird. Die Verbindung kann weiterhin für andere Anforderungen verwendet werden, und Anforderungen/Antworten, die gleichzeitig mit der abgebrochenen Anforderung ausgeführt wurden, werden möglicherweise fortgesetzt. [...] Es ist möglich, dass zu dem Zeitpunkt, zu dem RST_STREAM vom Client zum Server übertragen wird, der gesamte Inhalt der Anforderung übertragen wird und beim Client ankommt, wodurch dieser verworfen wird. Bei großen Antwortinhalten jedoch Das Senden eines RST_STREAM hat möglicherweise eine gute Chance, auf dem Server anzukommen, bevor der gesamte Antwortinhalt gesendet wird, und spart daher Bandbreite. "

Das beschriebene Verhalten ist das gleiche wie das, das ich beobachten kann. Aber das würde bedeuten, dass der Browser der Schuldige ist, und dann würde ich nicht verstehen, warum es auf zwei identischen Seiten passiert, von denen eine einen 200-Header und die andere einen 404-Header hat (dasselbe gilt, wenn ich JS deaktiviere).

31
Tristan G

Dieser Fehler wird derzeit behoben: https://chromium-review.googlesource.com/c/chromium/src/+/2001234

Aber es hat mir geholfen, die Nginx-Einstellungen zu ändern:

  • gzip einschalten;
  • add_header 'Cache-Control' 'No-Store, No-Cache, Must-Revalidate, Proxy-Revalidate, Max-Age = 0';
  • verfällt;

In meinem Fall fungiert Nginx als Reverse-Proxy für die Node.js-Anwendung.

0
EduardS

Ich habe dieses Problem seit der letzten Woche, als ich versucht habe, DELETE-Anfragen über AJAX an meinen PHP Server) zu senden. Ich habe kürzlich meinen Hosting-Plan aktualisiert, für den ich jetzt ein SSL-Zertifikat habe auf meinem Host, auf dem die Dateien PHP und JS) gespeichert sind. Seit dem Hinzufügen eines SSL-Zertifikats tritt dieses Problem nicht mehr auf. Ich hoffe, dies hilft bei diesem seltsamen Fehler.

0
Matthew Fallon

Mein Team hat dies in einer einzelnen Javascript-Datei gesehen, die wir bereitgestellt haben. Jede andere Datei hat gut funktioniert. Wir haben von http2 zurück zu http1.1 und dann entweder net::ERR_INCOMPLETE_CHUNKED_ENCODING oder ERR_CONTENT_LENGTH_MISMATCH. Letztendlich stellten wir fest, dass es einen Unternehmensfilter (Trustwave) gab, der fälschlicherweise einen "Infoleak" erkannte (wir vermuten, dass in unserer Datei/unserem Dateinamen etwas entdeckt wurde, das einer Sozialversicherungsnummer ähnelte). Durch die Optimierung dieses Filters durch Unternehmen wurden unsere Probleme behoben.

0
adamdport

In unserem Fall war der Grund ein ungültiger Header. Wie in Edit 4 erwähnt:

  • nimm die Protokolle
  • wählen Sie im Viewer Ereignisse
  • wählte HTTP2_SESSION

Suchen Sie nach etwas Ähnlichem:

HTTP2_SESSION_RECV_INVALID_HEADER

-> error = "Ungültiges Zeichen im Headernamen."

-> header_name = "charset = utf-8"

0

Ich war auch mit diesem Fehler konfrontiert und glaube, dass es mehrere Gründe dafür geben kann. Meins war, ARR wurde abgelaufen.

In meinem Fall hat der Browser eine Anfrage an eine Reverse-Proxy-Site gesendet, auf der ich meine Umleitungsregeln festgelegt habe, und diese Proxy-Site fordert schließlich die tatsächliche Site an. Für große Datenmengen dauerte es nun mehr als 2 Minuten und 5 Sekunden, und das Zeitlimit für das Routing von Anwendungsanforderungen für meinen Server wurde auf 2 Minuten festgelegt. Ich habe dies behoben, indem ich das ARR-Zeitlimit wie folgt erhöht habe: 1. Gehen Sie zu IIS 2. Klicken Sie auf Servername. 3. Klicken Sie im mittleren Bereich auf Routing-Cache für Anwendungsanforderungen. 4. Klicken Sie auf Server-Proxy-Einstellungen im rechten Bereich 5. Erhöhen Sie das Zeitlimit. 6. Klicken Sie auf Übernehmen

0
Ankit

Ich bin mehrmals auf diesen Fehler gestoßen, weil er große Ressourcen (größer als 3 MB) vom Server auf den Client übertragen hat.

0