Cache et gclid : paramètre de requête du clic publicitaire, clé de cache de page et premier octet mesuré

La gestion de gclid par le cache consiste à ignorer le paramètre gclid ajouté à la fin de l'URL d'un clic publicitaire et à répondre avec le fichier de cache de l'adresse sans paramètres. En mesurant le temps jusqu'au premier octet selon les paramètres et l'état du cache sur un serveur WordPress en configuration Nginx + Apache, gclid a ajouté 0,014 à 0,015 seconde, et les retards de plusieurs secondes ne sont apparus que lorsque le cache n'a pas pu servir.
Mesuré à l'intérieur du même serveur, le temps jusqu'au premier octet était de 0,014 à 0,015 seconde sans paramètres et de 0,029 à 0,030 seconde avec les paramètres de clic publicitaire. Quand WordPress a regénéré la même page sans cache, il a fallu 3,639 et 3,260 secondes.
1️⃣ Cache et gclid : URL de clic publicitaire et clé de cache
Avec le marquage automatique de Google Ads, [?gclid=valeur] est ajouté à la fin de l'URL des visiteurs qui cliquent sur une annonce. Cette valeur est un paramètre qui identifie le clic, elle change donc d'un visiteur à l'autre, même si la même personne qui reclique sur la même annonce peut retrouver la même valeur.
Les vraies URL de clic publicitaire ne portent pas que gclid. gad_source, gad_campaignid et gbraid s'y ajoutent souvent, et parfois aussi wbraid.
https://example.com/sample-page/?gad_source=1&gad_campaignid=1234567890&gbraid=EXAMPLE&gclid=EXAMPLE
https://example.com/sample-page/?gclid=EXAMPLE&gbraid=EXAMPLE&wbraid=EXAMPLEMême avec des paramètres à la fin de l'URL, le navigateur ouvre la même page, mais pour un cache c'est une autre adresse. La norme de cache HTTP (RFC 9111) définit la clé de cache, le critère qui permet à un cache de choisir une réponse stockée, comme composée au minimum de la méthode de la requête et de l'URI cible, et l'URI cible comprend la chaîne de requête.
Si la chaîne de requête entre telle quelle dans la clé de cache, chaque clic avec une valeur de gclid différente devient une nouvelle adresse. Le CDN, nginx et WP Rocket, que la réponse traverse, traitent ces paramètres chacun selon ses propres règles.
Si le CDN n'a pas de copie ou que sa clé de cache distingue les paramètres, la requête est transmise au serveur d'origine. La vitesse dépend ensuite de ce que nginx et WP Rocket trouvent ou non un fichier de cache.
2️⃣ Service statique de nginx : avec des paramètres, la requête passe à Apache
Même si le fichier de cache est sur le disque, nginx dans une configuration Nginx + Apache ne le sert pas directement à une requête avec des paramètres. En effet, la configuration ci-dessous, qui permet à nginx de lire directement les fichiers de cache de WP Rocket, ne construit le chemin du fichier que si la chaîne de requête est vide.
# nginx.conf — bloc http : conditions pour ignorer le fichier de cache
map $http_cookie $rocket_cookie {
default 0;
'~*wordpress_logged_in' 1;
'~*wp-postpass' 1;
'~*comment_author' 1;
'~*woocommerce_items' 1;
}
map $request_method $rocket_method {
default 1;
GET 0;
HEAD 0;
}
map $query_string $rocket_query {
default 1;
'' 0; # 0 seulement si la chaîne de requête est vide
}
# bloc server
set $rocket_bypass '';
if ($rocket_cookie = 1) { set $rocket_bypass '1'; }
if ($rocket_method = 1) { set $rocket_bypass '1'; }
if ($rocket_query = 1) { set $rocket_bypass '1'; }
set $rocket_file '/wp-content/cache/wp-rocket/example.com${request_uri}index-https.html';
if ($rocket_bypass = '1') { set $rocket_file ''; }
location / {
try_files $rocket_file @apache; # vers Apache si le chemin est vide ou le fichier absent
add_header X-Rocket-Nginx-Serving-File 'HIT' always; # indique que nginx a servi directement le fichier de cache
}[$rocket_query] vérifie seulement si toute la chaîne de requête est vide : gclid, que WP Rocket ignore, est donc traité comme n'importe quel autre paramètre. Si des copies mobiles sont gardées à part, une vérification de plus ajoute [-mobile] au nom du fichier.
Les règles [.htaccess] que WP Rocket écrit pour Apache exigent elles aussi une chaîne de requête vide. Que ce soit avec nginx ou Apache, l'étape qui sert directement le fichier de cache sans PHP ne s'applique qu'aux requêtes sans paramètres.
Les requêtes sans paramètres portaient l'en-tête [X-Rocket-Nginx-Serving-File: HIT], et les six requêtes avec gclid et des paramètres de type publicitaire ne l'avaient pas. Si le temps jusqu'au premier octet a augmenté de 0,014 à 0,015 seconde pour les requêtes avec paramètres, c'est qu'Apache et PHP ont dû lire le fichier de cache pour répondre.
curl -so /dev/null -H 'Accept-Encoding: gzip' -w '%{time_starttransfer}\n' \
'https://example.com/sample-page/'0.015127curl -so /dev/null -H 'Accept-Encoding: gzip' -w '%{time_starttransfer}\n' \
'https://example.com/sample-page/?gclid=test123'0.029525curl -sI 'https://example.com/sample-page/' | grep -i x-rocket-nginx-serving-filex-rocket-nginx-serving-file: HIT[time_starttransfer] est le temps entre la requête et la réception du premier octet. Pour mesurer dans le serveur sans passer par le CDN, ajoutez [--resolve example.com:443:127.0.0.1].
3️⃣ Liste des paramètres ignorés de WP Rocket : même fichier de cache
Ne pas mettre en cache les URL avec paramètres est le comportement par défaut de WP Rocket, mais les paramètres de clic publicitaire font exception. WP Rocket retire avant de décider les paramètres présents dans sa liste des ignorés et, s'il n'en reste aucun, répond avec le fichier de cache de l'adresse sans paramètres.
// wp-rocket/inc/classes/Buffer/class-tests.php (3.23.5.1)
public function get_query_params() {
// …
$params = array_diff_key( // retire d'abord les paramètres ignorés
self::$get,
$this->config->get_config( 'cache_ignored_parameters' )
);
// …
}
public function can_process_query_string() {
// …
$params = $this->get_query_params();
if ( ! $params ) { // plus aucun paramètre : traitement par le cache
return self::memoize( __FUNCTION__, [], true );
}
// seuls lang · s · permalink_name · lp-variation-id et les paramètres ajoutés à [Cache Query String(s)] passent
// …
}Si ce que renvoie [get_query_params] après avoir retiré les paramètres ignorés est vide, le chemin du fichier de cache est lui aussi celui de l'adresse sans paramètres. La requête avec gclid est passée par Apache et PHP, mais le commentaire de cache à la fin du HTML était le même que pour la requête sans paramètres, et la réponse pesait 350 668 octets, comme le fichier de cache (gzip).
La liste des paramètres ignorés est une liste par défaut que WP Rocket télécharge une fois par semaine depuis ses propres serveurs et enregistre dans [wp-content/wp-rocket-config/dynamic-lists.json]. Au 17 octobre 2026, elle contient gclid, gbraid, wbraid, gad_source et gad_campaignid.
Si un seul paramètre absent de la liste s'y mêle, WP Rocket n'utilise pas le cache : la même page avec un paramètre quelconque hors liste a été regénérée par WordPress, sans commentaire de cache. Si vos URL publicitaires portent des paramètres de suivi faits maison, ces clics prennent ce chemin à chaque fois.
Pour modifier la liste, servez-vous de l'extension d'assistance que recommande WP Rocket. L'extension ajoute ou retire des paramètres avec le filtre [rocket_cache_ignored_parameters] et régénère le fichier de configuration de WP Rocket à son activation et à sa désactivation.
// extrait de WP Rocket | Ignore Query Strings 1.1.1 (extension d'assistance de l'équipe support de WP Rocket)
function define_ignored_parameters( array $params ) {
$params['new_query_string'] = 1; // ajouter aux paramètres ignorés
//unset ( $params['utm_source'] ); // retirer des paramètres ignorés
return $params;
}
add_filter( 'rocket_cache_ignored_parameters', __NAMESPACE__ . '\define_ignored_parameters', 999 );
register_activation_hook( __FILE__, __NAMESPACE__ . '\flush_wp_rocket' ); // à l'activation, exécute rocket_generate_config_file()WP Rocket inscrit cette liste dans le fichier de configuration au nom du domaine, dans [wp-content/wp-rocket-config/], et lit ce fichier à chaque requête : si vous ajoutez seulement le filtre sans régénérer le fichier de configuration, la nouvelle liste ne s'applique pas. Les paramètres de la liste utilisent l'unique fichier de cache de l'adresse de base quelle que soit leur valeur ; n'y mettez donc pas de paramètres dont la valeur change le contenu de la page.
Après avoir ajouté [uk_test], absent de la liste, à l'extension d'assistance puis l'avoir activée, le fichier de configuration a été régénéré et ce paramètre ajouté en fin de liste. L'adresse sans paramètres puis deux adresses avec des valeurs de [uk_test] différentes ont ensuite été demandées.
curl -s -o /dev/null -w '%{size_download} %{time_starttransfer}\n' -H 'Accept-Encoding: gzip' 'https://example.com/sample-page/'
curl -s -o /dev/null -w '%{size_download} %{time_starttransfer}\n' -H 'Accept-Encoding: gzip' 'https://example.com/sample-page/?uk_test=abc'
curl -s -o /dev/null -w '%{size_download} %{time_starttransfer}\n' -H 'Accept-Encoding: gzip' 'https://example.com/sample-page/?uk_test=xyz'21390 0.025720
21390 0.025507
21390 0.027929Les trois requêtes ont renvoyé les mêmes 21 390 octets en moins de 0,03 seconde, et la fin du HTML de la requête avec [uk_test] a été ouverte pour vérifier l'heure du cache.
curl -s --compressed 'https://example.com/sample-page/?uk_test=abc' | tail -c 200ck=lazyLoadYoutubeIframe;}});</script></body>
</html>
<!-- This website is like a Rocket, isn't it? Performance optimized by WP Rocket. Learn more: https://wp-rocket.me - Debug: cached@1792248839 -->L'heure de cache du commentaire final était celle du fichier de cache de l'adresse sans paramètres. Avant l'activation de l'extension d'assistance, la même requête était regénérée en 0,36 à 0,38 seconde, sans commentaire de cache.
Même après l'activation, une requête portant aussi [foo], absent de la liste, n'a pas utilisé le fichier de cache et a été regénérée.
Pendant la minute qui a suivi la régénération du fichier de configuration, les requêtes [uk_test] ont elles aussi été regénérées. PHP OPcache revérifiant les fichiers modifiés toutes les 60 secondes (revalidate_freq) dans cette configuration, la réponse n'est venue du fichier de cache qu'au bout d'une minute.
Même après désactivation et suppression de l'extension d'assistance, la ligne [uk_test] est restée dans le fichier de configuration. Le code exécuté à la désactivation tente de retirer avec la priorité par défaut le filtre ajouté en priorité 999 : le fichier est donc régénéré avec le filtre toujours en place. Il faut régénérer le fichier de configuration une fois de plus après la suppression de l'extension pour qu'il disparaisse de la liste.
4️⃣ Clé de cache du CDN : exclure les paramètres publicitaires et requêtes vers l'origine
Si le CDN met la chaîne de requête telle quelle dans la clé de cache, chaque clic avec une valeur de gclid différente ne trouve pas de copie et la requête remonte jusqu'au serveur d'origine. Retirer tous les paramètres règle le problème, mais ne convient pas aux sites dont certaines adresses changent de contenu selon les paramètres, comme les résultats de recherche : mieux vaut retirer de la clé de cache les seuls paramètres publicitaires.
Une fois les paramètres publicitaires retirés ainsi, le CDN répond avec la même copie que l'adresse sans paramètres même si la valeur de gclid change, et ne s'adresse au serveur d'origine, paramètres compris, que s'il n'a pas de copie.
# état du cache CDN pour deux requêtes avec un gclid différent (le nom des en-têtes dépend du CDN)
curl -sI 'https://example.com/sample-page/?gclid=test1' | grep -i -E 'cache|age'curl -sI 'https://example.com/sample-page/?gclid=test2' | grep -i -E 'cache|age'Si les deux requêtes aux valeurs différentes sont des HIT et que leurs copies ont été enregistrées à la même heure que celle de l'adresse sans paramètres, ce CDN exclut gclid de sa clé de cache. La première visite sur un point de présence sans copie passe quand même par nginx et WP Rocket sur le serveur d'origine, même si le CDN retire les paramètres publicitaires de la clé.
5️⃣ Ce qui ralentit les clics publicitaires : un cache de page vide
Quand la première page venant d'une annonce est lente, on accuse volontiers gclid de contourner le cache, mais s'il existe un fichier de cache, c'est ce même fichier qui répond malgré les paramètres. Ce qui ajoute des secondes au temps jusqu'au premier octet, c'est un fichier de cache vide qui oblige WordPress à regénérer la page.
Les fichiers de cache sont supprimés une fois écoulé le Délai de nettoyage du cache ; la valeur par défaut de WP Rocket est de 10 heures. L'enregistrement d'un article ou des réglages supprime aussi le cache lié, et quand la liste que WP Rocket télécharge chaque semaine est remplacée par une nouvelle version, tout le cache du site est vidé.
Avec le préchargement activé, WP Rocket rouvre les adresses vidées et remplit de nouveau le cache ; les visiteurs arrivés avant attendent que la page soit générée. Une requête ne portant que des paramètres publicitaires crée elle aussi le fichier de cache sous l'adresse sans paramètres : le clic publicitaire qui tombe le premier sur un cache vide le remplit pour le visiteur suivant.
Juste après le vidage du cache, la première requête ouverte avec des paramètres de type publicitaire n'a trouvé aucun fichier de cache et a été regénérée en 0,341 à 0,369 seconde, et le fichier de cache de l'adresse sans paramètres est apparu dans la même seconde.
curl -s -o /dev/null -w '%{size_download} %{time_starttransfer}\n' -H 'Accept-Encoding: gzip' 'https://example.com/sample-page/?gclid=EXAMPLE1'
ls -l --time-style='+%F %T' wp-content/cache/wp-rocket/example.com/sample-page/
curl -s -o /dev/null -w '%{size_download} %{time_starttransfer}\n' -H 'Accept-Encoding: gzip' 'https://example.com/sample-page/'21361 0.366881
total 116
-rw-r--r-- 1 example nobody 90908 2026-10-17 23:56:38 index-https.html
-rw-r--r-- 1 example nobody 21385 2026-10-17 23:56:38 index-https.html_gzip
21385 0.025379Les trois essais se sont déroulés dans le même ordre, et la requête sans paramètres qui a suivi a été servie par le nouveau fichier de cache en 0,023 à 0,025 seconde. La requête ne venant pas d'un appareil mobile, seuls les deux fichiers pour ordinateur ont été créés.
Pour les adresses vers lesquelles pointent vos annonces, vérifiez vous-même s'il existe un fichier de cache et quand il a été créé ; si des copies mobiles sont générées à part, contrôlez ensemble les fichiers pour ordinateur et pour mobile.
ls -l --time-style='+%F %T' wp-content/cache/wp-rocket/example.com/sample-page/total 3520
-rw-r--r-- 1 example nobody 1445922 2026-10-17 14:07:44 index-https.html
-rw-r--r-- 1 example nobody 350668 2026-10-17 14:07:44 index-https.html_gzip
-rw-r--r-- 1 example nobody 1446862 2026-10-17 14:07:47 index-mobile-https.html
-rw-r--r-- 1 example nobody 351042 2026-10-17 14:07:47 index-mobile-https.html_gzipcurl -s --compressed 'https://example.com/sample-page/?gclid=test123' | tail -c 200n/1/wp-content/uploads/example-plugin/style.css' media='all' /></noscript></body>
</html>
<!-- Cached for great performance - Debug: cached@1792213663 -->Une réponse servie par un fichier de cache porte, dans le commentaire final du HTML, l'heure de création du fichier en temps Unix après [Debug: cached@]. Sans cette marque, la réponse a été regénérée par WordPress.
🔢 FAQ & contenus recommandés
















ℹ️ Mention d'affiliation
Le contenu de ce site contient des liens d'affiliation. Lorsqu'un visiteur achète un produit ou un service via l'un de ces liens, le site perçoit une commission du vendeur. Le montant payé par l'acheteur(il baisse lors des promotions ↓), lui, n'augmente pas. Les prix, remises et stocks indiqués correspondent à la date de rédaction et peuvent différer ; vérifiez-les donc auprès du vendeur avant d'acheter. Les produits sont choisis et évalués selon nos propres critères, et les commissions n'influencent ni l'ordre de présentation ni le contenu des évaluations.