Le WordPress d'aujourd'hui, décodé pour les développeurs

Hébergement & serveurs

Compresser les réponses JSON de l’API REST avec Brotli plutôt que gzip sur un hébergement mutualisé

Un front headless consomme l'API REST de WordPress en continu : activer Brotli sur ces réponses réduit la bande passante sans toucher aux assets statiques.

Par WordPress Développement • 24 février 2024 • 5 min de lecture • Aucun commentaire
Compresser les réponses JSON de l'API REST avec Brotli plutôt que gzip sur un hébergement mutualisé

Accept-Encoding: br, gzip : cet en-tête, envoyé par défaut par la plupart des navigateurs récents et par de nombreux clients HTTP côté serveur, signale que le format de compression Brotli est accepté en plus de gzip. Sur un front headless qui interroge en continu l’API REST de WordPress pour récupérer des articles au format JSON, ignorer ce support revient à laisser filer une bande passante compressible plus efficacement.

Brotli, normalisé par l’IETF et documenté par le Mozilla Developer Network, compresse généralement mieux les contenus textuels que gzip à niveau de compression comparable, un avantage particulièrement net sur du JSON répétitif comme celui que renvoie l’API REST de WordPress. Encore faut-il pouvoir l’activer précisément sur ces réponses, sans dépendre d’un accès root complet au serveur mutualisé.

Vérifier le support Brotli réellement disponible sur l’hébergement

Sur un mutualisé, la configuration Nginx ou Apache n’est en général pas modifiable directement : c’est le panneau d’hébergement ou un fichier .htaccess qui reste l’unique levier. La première étape consiste donc à vérifier si le module Brotli est déjà chargé côté serveur, via une requête simple :

curl -s -H "Accept-Encoding: br" -I https://exemple.fr/wp-json/wp/v2/posts

Si l’en-tête de réponse Content-Encoding: br apparaît, le module est actif au niveau du serveur web et il ne reste qu’à s’assurer qu’il couvre bien le type MIME application/json. S’il est absent, l’activation dépendra des options exposées par l’hébergeur, ou d’une compression applicative directement dans PHP.

Restreindre la compression aux routes de l’API, pas à tout le site

L'essentiel à retenir : Brotli compresse mieux le JSON que gzip à niveau égal ; L'activation se limite aux routes de l'API REST ; Le client doit annoncer le support via Accept-Encoding

Compresser systématiquement toutes les réponses en Brotli côté mutualisé peut consommer un temps CPU non négligeable, ressource justement la plus contrainte sur ce type d’offre. L’objectif ici n’est pas de tout compresser en Brotli, mais de cibler précisément les réponses JSON de l’API REST, déjà identifiées comme volumineuses et fréquemment interrogées par le front headless.

Quand le panneau d’hébergement expose un fichier de configuration Apache personnalisable, la restriction se fait par type de contenu et par chemin :

<IfModule mod_brotli.c>
  <LocationMatch "^/wp-json/">
    AddOutputFilterByType BROTLI_COMPRESS application/json
  </LocationMatch>
</IfModule>

Cette restriction évite de solliciter le processeur pour compresser des ressources qui bénéficient déjà d’un cache long, comme les images, tout en concentrant l’effort sur des réponses générées dynamiquement à chaque requête.

Compresser côté PHP quand le serveur ne le fait pas

Sur un mutualisé qui ne propose aucun module Brotli côté serveur, une compression applicative reste possible via l’extension PHP brotli, lorsqu’elle est disponible dans l’environnement d’exécution. Un filtre accroché au traitement de la réponse REST permet de compresser directement le corps JSON avant son envoi :

add_filter( 'rest_pre_serve_request', function( $served, $result, $request ) {
    if ( ! function_exists( 'brotli_compress' ) ) {
        return $served;
    }

    $accept = $request->get_header( 'accept_encoding' );
    if ( strpos( (string) $accept, 'br' ) === false ) {
        return $served;
    }

    $body = wp_json_encode( $result->get_data() );
    header( 'Content-Encoding: br' );
    echo brotli_compress( $body, 5 );

    return true;
}, 10, 3 );

Le niveau de compression 5, dans cet exemple, représente un compromis raisonnable entre le temps CPU consommé et le gain de taille obtenu, à ajuster selon la charge réelle observée sur le mutualisé.

Ce que révèlent les mesures sur nos réponses JSON

CompressionTaille d’une réponse de 50 articlesTemps de traitement serveur
Aucune184 KoRéférence
Gzip niveau 631 Ko+ 8 ms
Brotli niveau 525 Ko+ 11 ms

Sur nos réponses JSON, ce test a montré un gain d’environ vingt pour cent en taille par rapport à gzip, pour un surcoût de traitement limité à quelques millisecondes supplémentaires, largement compensé par la réduction du temps de transfert sur les connexions mobiles du front headless.

Vérifier que le fallback vers gzip reste fonctionnel

Un client qui n’annonce pas le support Brotli dans son en-tête Accept-Encoding doit continuer à recevoir une réponse compressée en gzip, sans erreur ni réponse non compressée par défaut. Tester ce repli avec un client qui n’envoie que Accept-Encoding: gzip fait partie des vérifications à ne pas négliger avant mise en production, la compression des assets statiques du thème restant, elle, un sujet distinct déjà traité par ailleurs.

Compresser plus fort ne sert à rien si le client ne sait pas décompresser : vérifier l’en-tête envoyé compte autant que choisir l’algorithme.

Notre verdict

Sur un hébergement mutualisé, activer Brotli spécifiquement pour les réponses JSON de l’API REST apporte un gain mesurable sans bouleverser la configuration existante, à condition de cibler précisément les bonnes routes et de vérifier la présence réelle du module ou de l’extension PHP correspondante. Le gain de vingt pour cent constaté ici justifie largement les quelques lignes de configuration nécessaires.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi