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
Code language: JavaScript (javascript)
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: <em>/</em>
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)
Code language: PHP (php)
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
Code language: CSS (css)
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)!
Recherchez-vous un expert WordPress ou WooCommerce sur qui vous pouvez compter? Ne cherchez plus.