Obfuscation de Liens SEO pour PrestaShop
Installation, configuration des presets, écriture des sélecteurs CSS et vérification du rendu servi aux crawlers.
Ce guide couvre l’installation, la configuration et la vérification du module dfobfuscator sur PrestaShop 8 et 9.
Installation
- Rendez-vous dans Modules et Services, Envoyer un module dans votre back-office.
- Déposez le fichier
dfobfuscator.zippuis validez. - Cliquez sur Configurer une fois l’installation terminée.
Le module s’enregistre automatiquement sur deux hooks : actionOutputHTMLBefore pour la réécriture du HTML et actionFrontControllerSetMedia pour le chargement des assets front. Aucun override de fichier core n’est créé.
L’extension PHP DOM doit être active. Elle l’est par défaut sur la quasi-totalité des hébergements. En son absence, le module reste installé mais laisse le HTML inchangé.
Configuration
Activer l’obfuscation
L’interrupteur principal désactive toute la réécriture sans désinstaller le module. Pratique pour comparer le code source avant et après, ou pour isoler le module lors d’un diagnostic.
Les trois presets
| Preset | Ce qu’il cible | Défaut |
|---|---|---|
| Navigation à facettes | Les blocs de filtres et la liste des filtres actifs | Activé |
| Tri des produits | Le menu déroulant de tri | Activé |
| Pagination | Les liens de page 2, 3 et suivantes | Désactivé |
N’activez la pagination que si votre sitemap XML et votre maillage interne rendent chaque fiche produit accessible autrement. Sinon, vous coupez le seul chemin d’exploration vers une partie de votre catalogue.
Sélecteurs CSS personnalisés
Un sélecteur par ligne. Les virgules sur une même ligne sont également acceptées. Chaque lien correspondant à un sélecteur est obfusqué.
#footer .account-links a
.block-tags a
.my-custom-block a[data-filter]
Le convertisseur interne prend en charge la balise, l’identifiant, la classe, les attributs (présence ou valeur exacte), le combinateur descendant et le combinateur enfant direct. Si votre boutique embarque symfony/css-selector dans son vendor, le module l’utilise en priorité et vous disposez alors de la syntaxe CSS complète.
Lignes XPath
Pour les sélections que le CSS ne permet pas d’exprimer, préfixez la ligne par xpath: :
xpath://div[@id='js-product-list']//a[contains(@href,'?order=')]
Contrôleurs exclus
Liste de noms de contrôleurs front séparés par des virgules. Sur ces pages, aucune réécriture n’a lieu et les assets ne sont pas chargés. Valeur par défaut : order,cart. Ajoutez-y tout contrôleur dont le parcours ne doit dépendre d’aucun JavaScript.
Comment fonctionne la réécriture
Sur le hook actionOutputHTMLBefore, le module reçoit le HTML complet de la page. Il vérifie d’abord qu’il s’agit bien d’un document HTML entier, ce qui écarte les réponses AJAX et JSON. Il charge ensuite le document dans DOMDocument, convertit chaque sélecteur en requête XPath, puis remplace les liens trouvés par des éléments span.
Chaque élément obfusqué reçoit :
- un attribut
data-ocontenant l’URL en base64 inversé ; - la classe
df-obfen plus de ses classes d’origine ; tabindex="0"etrole="link"pour l’accessibilité ;data-tquand le lien d’origine portait un attribut target.
Les liens dont l’URL commence par #, mailto:, tel: ou javascript: sont ignorés. L’attribut rel est retiré, l’attribut target est conservé sous forme de data-t.
Repli automatique
Si l’analyse du document échoue, ou si aucun sélecteur ne correspond à un lien, le HTML d’origine est renvoyé sans modification. Le module ne peut donc pas casser une page à cause d’un balisage inattendu.
Contenu chargé en AJAX
Le rafraîchissement des filtres et le scroll infini réinjectent des liens après le rendu initial. Le fichier front.js installe un MutationObserver qui applique les mêmes sélecteurs à ces nouveaux liens, côté navigateur. Les sélecteurs sont transmis au front via Media::addJsDef. Les lignes XPath sont exclues de ce mécanisme, le navigateur ne les évaluant pas.
Vérifier que ça fonctionne
- Ouvrez une page catégorie avec des filtres, puis affichez le code source de la page (Ctrl+U, pas l’inspecteur d’éléments).
- Recherchez
df-obf: vous devez trouver des éléments span à la place des liens de filtres. - Recherchez une URL de filtre, par exemple
?q=: elle ne doit plus apparaître dans un attribut href.
L’inspecteur d’éléments affiche le DOM après exécution du JavaScript, pas le HTML servi. Pour juger du résultat côté crawler, utilisez toujours l’affichage du code source ou un outil comme curl.
Côté navigation, testez le clic gauche, le clic molette, le ctrl+clic (cmd+clic sur macOS) et la touche Entrée après avoir atteint un filtre à la tabulation.
Dépannage
Rien n’est obfusqué
Vérifiez dans l’ordre : l’interrupteur principal est actif, au moins un preset ou un sélecteur est renseigné, le contrôleur courant n’est pas dans la liste des exclusions, l’extension PHP DOM est disponible. Videz ensuite le cache PrestaShop.
Un thème personnalisé n’est pas couvert
Les presets ciblent les sélecteurs du thème Classic. Sur un thème sur mesure, inspectez le bloc de filtres pour relever son identifiant ou sa classe conteneur, puis ajoutez une ligne de sélecteur personnalisé.
Un lien obfusqué par erreur
Réduisez la portée du sélecteur en ciblant un conteneur plus précis, ou retirez le preset concerné et remplacez-le par des sélecteurs personnalisés plus étroits.
Le module de recherche AJAX perd ses liens
Certains modules tiers reconstruisent entièrement leur bloc de filtres. Si le comportement diffère entre le premier affichage et le rafraîchissement, vérifiez que le sélecteur personnalisé s’applique bien au conteneur reconstruit et non à un élément détruit à chaque mise à jour.
Questions fréquentes
Est-ce du cloaking ?
Non. Le HTML servi est identique pour tous : aucun test de user-agent, aucune variante de page. Le lien n’existe pour personne dans le code source, et le navigateur le reconstitue au moment de l’interaction.
Les URLs déjà indexées disparaissent-elles ?
Non. L’obfuscation agit sur la découverte de nouvelles URLs. Pour les URLs déjà dans l’index, conservez vos directives noindex ou vos redirections le temps que Google les revisite.
Quel impact sur les performances ?
Une analyse DOM de la page finale, de l’ordre de quelques millisecondes sur une page catégorie standard. Côté front, 5 Ko de JavaScript et 0,2 Ko de CSS.
Faut-il désactiver le module pendant un audit SEO ?
Non, au contraire : l’audit doit refléter ce que voient les crawlers. Si votre outil d’audit signale une chute du nombre de liens internes sur les pages catégories, c’est le résultat attendu.