Ich arbeite derzeit an einer Website, die einen net::ERR_HTTP2_PROTOCOL_ERROR 200
Fehler in Google Chrome auslöst . Ich bin mir nicht sicher, was genau diesen Fehler hervorrufen kann. Ich habe gerade 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 richtig ausgeführt wird.
Das folgende Szenario tritt beispielsweise auf:
Ich greife in HTTPS auf die Website zu
Mein über https://publish.twitter.com integrierter Twitter-Feed wird überhaupt nicht geladen
Ich kann in der Konsole den ERR_HTTP2_PROTOCOL_ERROR feststellen
Wenn ich den Code zum Laden des Twitter-Feeds entferne, bleibt der Fehler bestehen
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: Es funktioniert sowohl unter Edge als auch unter Firefox. (NB: 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 angezeigt wird. Der Fehler tritt nicht in Version 64.X auf, sondern in Version 75 + (unabhängig vom Betriebssystem; ich arbeite auf einem Mac tho).
Jeder Hinweis an dieser Stelle zu untersuchen wäre gerne dankbar!
Danke im Voraus.
Tristan
Bearbeiten 1: Kann mit der Website OK in Firefox, aber nicht in Safari (kCFErrorDomainCFNetwork-Fehler 303) oder Chrome (net :: ERR_SPDY_PROTOCOL_ERROR) zusammenhängen.
Edit 2: Ergebnisse weiterer Untersuchungen sind folgende:
- Der Fehler wird nicht auf genau derselben Seite angezeigt, wenn der Server 404 anstelle von 2XX zurückgibt
- 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 unabhängig von der verwendeten PHP-Version von 5.6 bis 7.3 auf (verwendetes Framework: Cakephp 2.10)
Bearbeiten 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.
Google Chrome-Header (mit Fehler):
Firefox-Header (ohne Fehler):
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
Bearbeiten 4: Der Versuch, mit den Tools chrome: // net-export / und https://netlog-viewer.appspot.com tiefer zu gehen, sagt mir, dass die Anforderung 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 RST_STREAM empfängt, hört er auf, DATA-Frames an den Client zu senden, wodurch die Antwort gestoppt wird." (oder der Download). Die Verbindung kann weiterhin für andere Anforderungen verwendet werden, und Anforderungen / Antworten, die gleichzeitig mit der abgebrochenen angefordert wurden, können fortgesetzt werden. [...] Es ist möglich, dass RST_STREAM zu dem Zeitpunkt abläuft Wenn der Client an den Server gesendet wird, wird der gesamte Inhalt der Anforderung übertragen und kommt beim Client an, wodurch er verworfen wird. Bei großen Antwortinhalten kann das Senden eines RST_STREAM jedoch eine gute Chance haben, vor dem Ganzen am Server anzukommen Antwortinhalte werden gesendet und sparen 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).