Je travaille actuellement sur un site Web, ce qui déclenche une net::ERR_HTTP2_PROTOCOL_ERROR 200
erreur 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 de s'exécuter correctement.
Par exemple, le scénario suivant se produit:
J'accède au site Web en HTTPS
Mon flux Twitter intégré via https://publish.twitter.com n'est pas du tout chargé
Je peux remarquer dans la console l'ERR_HTTP2_PROTOCOL_ERROR
Si je supprime le code pour charger le flux Twitter, l'erreur persiste
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 qui déclenche l'erreur: il fonctionne bien sur Edge et Firefox. (NB: j'ai essayé avec Safari, et j'ai une kcferrordomaincfnetwork 303
erreur similaire )
Je me demandais si cela pouvait être lié à l'en-tête retourné 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 des versions très récentes de Google Chrome; l'erreur n'apparaît pas sur v.64.X, mais elle le fait 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é au site Web OK sur Firefox mais pas sur Safari (erreur 303 kCFErrorDomainCFNetwork) ni Chrome (net :: ERR_SPDY_PROTOCOL_ERROR)
Edit 2: Les résultats des enquêtes complémentaires 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 le 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 quelle que soit la version PHP 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.
En-tête Google Chrome (avec erreur):
En-tête Firefox (sans erreur):
Une curl --head --http2
demande 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 les outils chrome: // net-export / et https://netlog-viewer.appspot.com me dit que 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 cessera d'envoyer des trames de données au client, arrêtant ainsi la réponse (ou le téléchargement). La connexion est toujours utilisable pour d'autres demandes, et les demandes / réponses qui étaient simultanées à celle qui a été abandonnée peuvent continuer à progresser. [...] Il est possible qu'au moment où le RST_STREAM passe de du client au serveur, tout le contenu de la demande est 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 au serveur avant le tout. le contenu de la réponse est envoyé et économisera donc 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).