Résoudre l’erreur “HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR”

Le serveur héberge plusieurs sites et l’un d’entre eux, Utopique, retournait l’erreur curl: (92) HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1) lorsqu’on le visitait avec Chrome mais fonctionnait sans souci avec Firefox.

Le plus drôle dans l’histoire (enfin drôle, j’ai passé deux jours à éplucher mes server blocks, les logs et la configuration SSL), c’est que ce site utilise le même modèle de server blocks que les autres. Je soupçonnais principalement la configuration NginX alors qu’en fait, elle n’y était pour rien!

Le problème se situe en fait au niveau de Cloudflare, et apparaît notamment avec le réglage suivant: Caching > Configuration > Browser Cache TTL > Respect Existing Headers.

Pour résoudre le problème, il faut choisir un autre réglage que “Respect Existing Headers”.

On creuse un peu à l’aide de curl pour comprendre ce qu’il se passe:

curl -vvv -I https://utopique.net --http2

Voici le résultat de la commande:

 Trying 2606:4700:3036::ac43:dc02:443…
 TCP_NODELAY set
 Connected to utopique.net (2606:4700:3036::ac43:dc02) port 443 (#0)
 ALPN, offering h2
 ALPN, offering http/1.1
 successfully set certificate verify locations:
 CAfile: /etc/ssl/certs/ca-certificates.crt
 CApath: /etc/ssl/certs
 TLSv1.3 (OUT), TLS handshake, Client hello (1):
 TLSv1.3 (IN), TLS handshake, Server hello (2):
 TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
 TLSv1.3 (IN), TLS handshake, Certificate (11):
 TLSv1.3 (IN), TLS handshake, CERT verify (15):
 TLSv1.3 (IN), TLS handshake, Finished (20):
 TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
 TLSv1.3 (OUT), TLS handshake, Finished (20):
 SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
 ALPN, server accepted to use h2
 Server certificate:
 subject: C=US; ST=CA; L=San Francisco; O=Cloudflare, Inc.; CN=sni.cloudflaressl.com
 start date: Jul 10 00:00:00 2020 GMT
 expire date: Jul 10 12:00:00 2021 GMT
 subjectAltName: host "utopique.net" matched cert's "utopique.net"
 issuer: C=US; O=Cloudflare, Inc.; CN=Cloudflare Inc ECC CA-3
 SSL certificate verify ok.
 Using HTTP2, server supports multi-use
 Connection state changed (HTTP/2 confirmed)
 Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
 Using Stream ID: 1 (easy handle 0x564540aecc80) 
   HEAD / HTTP/2
   Host: utopique.net
   user-agent: curl/7.68.0
   accept: /
      TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
   TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
   old SSL session ID is stale, removing
   Connection state changed (MAX_CONCURRENT_STREAMS == 256)!
   http2 error: Invalid HTTP header field was received: frame type: 1, stream: 1, name: [access-control-allow-headers "origin, x-requested-with, content-type, accept"], value: []
   HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)
   stopped the pause stream!
   Connection #0 to host utopique.net left intact
   curl: (92) HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)    

J’ai longtemps soupçonné NginX (à tort), ainsi que la configuration des entêtes (notamment CORS) puisque le message d’erreur les mentionne mais il se trouve que la clé de la résolution du problème se trouve dans cette ligne:

TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
   old SSL session ID is stale, removing

Le site en question utilisait auparavant WP-Rocket mais l’a récemment abandonné. Par conséquent, les directives de cache n’étaient plus active et le réglage Cloudflare sur “Respect Existing Headers” renvoyait sur une page déjà expirée, ce qui empêche l’affichage sur les navigateurs basés sur Chromium, comme Chrome ou Opera.

Voilà, j’espère que cela pourra en aider plus d’un(e)!

Envie d'ajouter des fonctionnalités exceptionnelles à votre site WordPress ou WooCommerce? Je suis là pour vous aider.

Explorons les possibilités ensemble »

Articles conseillés :

  • No Related Posts

Opinions