web-dev-qa-db-fra.com

De quoi parle le net :: ERR_HTTP2_PROTOCOL_ERROR?

Je travaille actuellement sur un site Web, ce qui déclenche une erreur net::ERR_HTTP2_PROTOCOL_ERROR 200 Sur Google Chrome. Je ne sais pas exactement ce qui peut provoquer cette erreur, je viens de remarquer qu'elle n'apparaît que lors de l'accès au site Web en HTTPS. Je ne peux pas être sûr à 100% qu'il est lié, mais il semble qu'il empêche le javascript d'être exécuté correctement.

Par exemple, le scénario suivant se produit:

  1. J'accède au site Web en HTTPS

  2. Mon flux Twitter intégré via https://publish.Twitter.com n'est pas du tout chargé

  3. Je peux remarquer dans la console l'ERR_HTTP2_PROTOCOL_ERROR

  4. Si je supprime le code pour charger le flux Twitter, l'erreur persiste

  5. Si j'accède au site Web en HTTP, le fil Twitter apparaît et l'erreur disparaît

Google Chrome est le seul navigateur Web déclenchant l'erreur: il fonctionne bien sur Edge et Firefox. (NB: j'ai essayé avec Safari, et j'ai une erreur kcferrordomaincfnetwork 303 Similaire))

Je me demandais si cela pouvait être lié à l'en-tête renvoyé par le serveur car il y a cette mention '200' dans l'erreur, et une page 404/500 ne déclenche rien.

Le problème est que l'erreur n'est pas documentée du tout. La recherche Google me donne très peu de résultats. De plus, j'ai remarqué qu'il apparaît sur les très récentes versions de Google Chrome; l'erreur n'apparaît pas sur v.64.X, mais sur v.75 + (quel que soit le système d'exploitation; je travaille sur Mac tho).

Tout indice à ce stade pour enquêter serait grandement apprécié!

Merci d'avance.

Tristan


Edit 1: Peut être lié à Site Web OK sur Firefox mais pas sur Safari (erreur 303 kCFErrorDomainCFNetwork)) Chrome (net :: ERR_SPDY_PROTOCOL_ERROR)


Edit 2: Les résultats d'autres investigations sont les suivants:

  • l'erreur n'apparaît pas exactement sur la même page si le serveur renvoie 404 au lieu de 2XX
  • l'erreur n'apparaît pas sur local avec un certificat HTTPS
  • erreur apparaît sur un autre serveur (les deux sont des OVH), qui utilise un certificat différent
  • l'erreur apparaît quoi que PHP est utilisée, de 5.6 à 7.3 (framework utilisé: Cakephp 2.10)

Edit 3: Comme demandé, ci-dessous est l'en-tête retourné pour la ressource défaillante, qui est la page Web entière. Même si l'erreur se déclenche sur chaque page ayant un en-tête HTTP 200, ces pages se chargent toujours sur le navigateur du client, mais parfois un élément manque (dans mon exemple, le flux Twitter externe). Tous les autres actifs de l'onglet Réseau ont un retour de réussite, sauf le document entier lui-même. line that failed in console

Google Chrome (avec erreur):

Chrome header

En-tête Firefox (sans erreur):

Firefox header

Une demande curl --head --http2 Dans la console renvoie le succès suivant:

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: Essayer d'aller plus loin avec le chrome: // net-export/and https://netlog-viewer.appspot.com tools me dit le la demande se termine par un RST_STREAM:

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

Pour ce que j'ai lu dans cet autre article , " Dans HTTP/2, si le client veut abandonner la demande, il envoie un RST_STREAM. Lorsque le serveur reçoit un RST_STREAM, il s'arrête envoi de trames DATA au client, arrêtant ainsi la réponse (ou le téléchargement). La connexion est toujours utilisable pour d'autres requêtes, et les requêtes/réponses qui étaient concurrentes avec celle qui a été abandonnée peuvent continuer à progresser. [...] Il est possible qu'au moment où le RST_STREAM se déplace du client vers le serveur, tout le contenu de la demande soit en transit et arrivera au client, qui le rejettera. Cependant, pour un contenu de réponse volumineux, l'envoi d'un RST_STREAM peut avoir une bonne chance d'arriver sur le serveur avant l'envoi de tout le contenu de la réponse, et donc d'économiser de la bande passante. "

Le comportement décrit est le même que celui que je peux observer. Mais cela signifierait que le navigateur est le coupable, et je ne comprendrais pas pourquoi cela se produit sur deux pages identiques, l'une ayant un en-tête 200 et l'autre un 404 (il en va de même si je désactive JS).

31
Tristan G

Cette erreur est en cours de correction: https://chromium-review.googlesource.com/c/chromium/src/+/2001234

Mais cela m'a aidé, en modifiant les paramètres de nginx:

  • activer gzip;
  • add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age = 0';
  • expire;

Dans mon cas, Nginx agit comme un proxy inverse pour l'application Node.js.

0
EduardS

Je rencontre ce problème depuis la semaine dernière maintenant que j'essaie d'envoyer des demandes DELETE à mon PHP via AJAX. J'ai récemment mis à niveau mon plan d'hébergement où j'ai maintenant un certificat SSL sur mon hôte qui stocke les fichiers PHP et JS. Depuis l'ajout d'un certificat SSL, je ne rencontre plus ce problème. En espérant que cela aide avec cette étrange erreur.

0
Matthew Fallon

Mon équipe l'a vu sur un seul fichier javascript que nous servions. Tous les autres fichiers ont bien fonctionné. Nous sommes passés de http2 retour à http1.1 puis soit net::ERR_INCOMPLETE_CHUNKED_ENCODING ou ERR_CONTENT_LENGTH_MISMATCH. Nous avons finalement découvert qu'il y avait un filtre d'entreprise (Trustwave) qui détectait par erreur une "infoleak" (nous soupçonnons qu'il a détecté quelque chose dans notre fichier/nom de fichier qui ressemblait à un numéro de sécurité sociale). La modification de ce filtre par les entreprises a résolu nos problèmes.

0
adamdport

J'ai eu le même problème (asp, c # - HttpPostedFileBase) lors de la publication d'un fichier qui était supérieur à 1 Mo (même si l'application n'a pas de limitation de taille de fichier), pour moi, la simplification de la classe de modèle a aidé. Si vous rencontrez ce problème, essayez de supprimer certaines parties du modèle et voyez si cela vous aidera de quelque manière que ce soit. Cela semble étrange, mais a fonctionné pour moi.

0
L.V

Dans notre cas, la raison était un en-tête non valide. Comme mentionné dans Edit 4:

  • prenez les journaux
  • dans la visionneuse, choisissez Événements
  • choisi HTTP2_SESSION

Recherchez quelque chose de similaire:

HTTP2_SESSION_RECV_INVALID_HEADER

-> error = "Caractère non valide dans le nom de l'en-tête."

-> header_name = "charset = utf-8"

0

J'ai également fait face à cette erreur et je pense qu'il peut y avoir plusieurs raisons derrière elle. Le mien l'était, ARR était en train d'expiration.

Dans mon cas, le navigateur faisait une demande à un site proxy inverse où j'ai défini mes règles de redirection et ce site proxy demande finalement le site réel. Maintenant, pour les données volumineuses, cela prenait plus de 2 minutes 5 secondes et le délai d'expiration du routage des demandes d'application pour mon serveur a été défini sur 2 minutes. J'ai résolu ce problème en augmentant le délai d'expiration ARR par les étapes ci-dessous: 1. Accédez à IIS 2. Cliquez sur le nom du serveur 3. Cliquez sur Application Request Routing Cache dans le volet central 4. Cliquez sur Server Proxy settings dans le volet droit 5. Augmentez le délai 6. Cliquez sur Appliquer

0
Ankit

J'ai fait face à cette erreur plusieurs fois et c'était dû au transfert de grandes ressources (supérieures à 3 Mo) du serveur au client.

0