Curl (s'il a été compilé avec le support HTTP/2) présente le même problème mais en montre la raison :
Erreur http2 : Un champ d'en-tête HTTP non valide a été reçu : type de trame : 1, stream : 1, name : [upgrade], value : [h2,h2c]
Il semble que votre serveur propose une mise à niveau vers HTTP/2 alors que la connexion est déjà effectuée avec HTTP/2 - ce qui n'a aucun sens. De plus, c'est explicitement interdit. À partir de RFC 7540 section 8.1.2.2 :
Un point de terminaison NE DOIT PAS générer un message HTTP/2 contenant des champs d'en-tête spécifiques à la connexion. tout message contenant des champs d'en-tête spécifiques à la connexion. DOIT être traités comme des malformations (Section 8.1.2.6).... champs d'en-tête spécifiques à la connexion, tels que Keep-Alive, Pression, etc. champs d'en-tête spécifiques à la connexion, tels que Keep-Alive, Proxy-Connection, Transfer-Encoding, et Mise à niveau
Il me semble qu'il s'agit d'un bug car Apache ne devrait pas envoyer cet en-tête avec HTTP/2.
Je pense que vous avez une configuration comme celle-ci
Protocols h2 h2c http/1.1
Étant donné que les navigateurs ne supportent pas HTTP/2 sans TLS de toute façon et qu'aucun en-tête Upgrade n'est nécessaire avec HTTP/2 sur TLS, je vous recommande de remplacer cette configuration par
Protocols h2 http/1.1
Cela désactive la prise en charge de l'inutile HTTP/2 sans TLS, mais devrait permettre de se débarrasser de l'en-tête Upgrade de cette manière, puisqu'il n'est nécessaire que pour passer de HTTP simple à HTTP/2 simple.
EDIT : d'après le commentaire de l'OP changeant le Protocols
n'a pas aidé. Il était nécessaire de contourner explicitement ce comportement (i.e. bug) de mod_http2
en supprimant le Upgrade
en-tête :
Header unset Upgrade