# Obfuscation de Liens SEO pour PrestaShop

> 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…

- Page: <https://www.datafirefly.com/documentation/dfobfuscator/>
- Langue: fr
- Mis à jour le: 2026-07-28
- Autres langues: [en](https://www.datafirefly.com/en/documentation/dfobfuscator/index.md), [es](https://www.datafirefly.com/es/documentation/dfobfuscator/index.md), [de](https://www.datafirefly.com/de/documentation/dfobfuscator/index.md), [it](https://www.datafirefly.com/it/documentation/dfobfuscator/index.md), [pl](https://www.datafirefly.com/pl/documentation/dfobfuscator/index.md), [pt](https://www.datafirefly.com/pt/documentation/dfobfuscator/index.md), [nl](https://www.datafirefly.com/nl/documentation/dfobfuscator/index.md)
- Index: <https://www.datafirefly.com/documentation/llms.txt>

Ce guide couvre l'installation, la configuration et la vérification du module **dfobfuscator** sur PrestaShop 8 et 9.

## Installation

1. Rendez-vous dans **Modules et Services, Envoyer un module** dans votre back-office.
2. Déposez le fichier `dfobfuscator.zip` puis validez.
3. 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-o` contenant l'URL en base64 inversé ;
- la classe `df-obf` en plus de ses classes d'origine ;
- `tabindex="0"` et `role="link"` pour l'accessibilité ;
- `data-t` quand 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

1. Ouvrez une page catégorie avec des filtres, puis affichez le code source de la page (Ctrl+U, pas l'inspecteur d'éléments).
2. Recherchez `df-obf` : vous devez trouver des éléments span à la place des liens de filtres.
3. 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.
