Une page qui affiche un contenu différent selon la personne connectée ne doit jamais être servie depuis un cache public partagé entre tous les visiteurs : ce principe, énoncé ainsi, semble évident. Il l’est nettement moins au moment d’écrire la configuration d’un plugin de cache, où l’exclusion d’une page précise se décide souvent par une case à cocher facile à oublier.
Le contexte : un espace client sensible
Un cabinet comptable proposait sur son site un espace de prise de rendez-vous, permettant à chaque client de consulter ses créneaux réservés, de déposer des documents pour son dossier et de voir l’avancement de ses démarches en cours. Cette page devait rester rapide, y compris aux heures de forte affluence, sans pour autant risquer d’afficher à un client les informations d’un autre.
Le site utilisait par ailleurs un plugin de cache de page classique, configuré pour améliorer les temps de réponse de l’ensemble du site, y compris ses pages publiques à fort trafic comme la page d’accueil et la présentation des services.
Le risque identifié avant mise en production
Un test de configuration, mené avant l’ouverture publique de l’espace client, a consisté à se connecter simultanément avec deux comptes distincts dans deux navigateurs différents, et à comparer le contenu affiché après plusieurs rafraîchissements successifs de la page. L’objectif : vérifier qu’aucune information du premier compte ne s’affichait jamais, même brièvement, dans la session du second.

Le plugin de cache, dans sa configuration par défaut, excluait déjà les pages contenant un formulaire de connexion, mais ne détectait pas automatiquement toutes les pages affichant un contenu personnalisé après connexion, notamment celles construites avec un raccourci personnalisé plutôt qu’un gabarit dédié reconnu par le plugin.
Le correctif : exclusion explicite fondée sur le cookie de session
add_filter( 'cache_plugin_exclusion_urls', 'cabinet_exclure_espace_client' );
function cabinet_exclure_espace_client( $urls_exclues ) {
$urls_exclues[] = '/espace-client/';
$urls_exclues[] = '/espace-client/rendez-vous/';
$urls_exclues[] = '/espace-client/documents/';
return $urls_exclues;
}
// Vérification supplémentaire côté serveur, hors cache HTTP :
if ( is_user_logged_in() && ! headers_sent() ) {
header( 'Cache-Control: private, no-store' );
}
Le filtre exclut explicitement chaque URL de l’espace client de la logique de cache du plugin, tandis que l’en-tête Cache-Control: private, no-store, ajouté côté serveur pour tout visiteur connecté, empêche également tout cache intermédiaire (proxy, CDN) de stocker une copie de la page.
Vérification finale avant ouverture
- Connexion simultanée avec deux comptes distincts, comparaison du contenu affiché après plusieurs rafraîchissements.
- Inspection des en-têtes HTTP renvoyés sur les pages de l’espace client, pour confirmer l’absence de mise en cache.
- Vérification que les pages publiques du site, elles, restent bien servies depuis le cache, sans régression de performance générale.
Ce qui a été maintenu volontairement en dehors du cache
Au-delà des trois pages de l’espace client identifiées initialement, l’audit a été étendu à l’ensemble des points d’entrée générant un contenu personnalisé, y compris une page de confirmation de rendez-vous envoyée par lien direct depuis un courriel, facilement oubliée car rarement visitée en dehors de ce contexte précis. Cette page, elle aussi, affichait des informations propres au rendez-vous concerné et méritait la même exclusion explicite que les pages principales de l’espace client.
Cette étape d’audit élargi a pris plus de temps que la correction technique elle-même, mais elle s’est révélée nécessaire : une seule page personnalisée oubliée dans le périmètre de l’exclusion aurait suffi à recréer le risque que l’ensemble de la démarche cherchait justement à écarter.
Sur une page contenant des informations propres à un visiteur, l’absence de cache n’est pas une perte de performance : c’est une condition de fonctionnement correcte.
En résumé
Un plugin de cache de page correctement configuré pour un site public peut malgré tout laisser passer une page sensible construite hors des gabarits qu’il reconnaît automatiquement. L’exclusion explicite par URL, doublée d’un en-tête Cache-Control approprié pour tout visiteur connecté, a permis d’ouvrir l’espace de prise de rendez-vous du cabinet comptable avec la certitude qu’aucune information d’un client ne pourrait s’afficher chez un autre.