# SEO Link-Obfuskation für PrestaShop

> Diese Anleitung behandelt Installation, Konfiguration und Überprüfung des Moduls dfobfuscator unter PrestaShop 8 und 9. Installation Öffnen Sie im Backoffice Module und Dienste, Modul hochladen. Legen Sie die Datei dfobfuscator.zip…

- Seite: <https://www.datafirefly.com/de/documentation/dfobfuscator/>
- Sprache: de
- Aktualisiert am: 2026-07-28
- Weitere Sprachen: [fr](https://www.datafirefly.com/documentation/dfobfuscator/index.md), [en](https://www.datafirefly.com/en/documentation/dfobfuscator/index.md), [es](https://www.datafirefly.com/es/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/de/documentation/llms.txt>

Diese Anleitung behandelt Installation, Konfiguration und Überprüfung des Moduls **dfobfuscator** unter PrestaShop 8 und 9.

## Installation

1. Öffnen Sie im Backoffice **Module und Dienste, Modul hochladen**.
2. Legen Sie die Datei `dfobfuscator.zip` ab und bestätigen Sie.
3. Klicken Sie nach Abschluss der Installation auf **Konfigurieren**.

Das Modul registriert sich auf zwei Hooks: `actionOutputHTMLBefore` für die HTML-Umschreibung und `actionFrontControllerSetMedia` für das Laden der Frontend-Assets. Es wird kein Core-Override angelegt.

Die PHP-Erweiterung `DOM` muss aktiv sein. Bei nahezu allen Hostern ist sie standardmäßig aktiviert. Fehlt sie, bleibt das Modul installiert, lässt das HTML jedoch unverändert.

## Konfiguration

### Obfuskation aktivieren

Der Hauptschalter deaktiviert die gesamte Umschreibung, ohne das Modul zu deinstallieren. Praktisch, um den Quelltext vorher und nachher zu vergleichen oder das Modul bei einer Fehlersuche zu isolieren.

### Die drei Presets

| Preset | Zielt auf | Standard |
| --- | --- | --- |
| Facettennavigation | Filterblöcke und die Liste aktiver Filter | Aktiv |
| Produktsortierung | Das Sortier-Dropdown | Aktiv |
| Paginierung | Links zu Seite 2, 3 und folgenden | Inaktiv |

Aktivieren Sie die Paginierung nur, wenn XML-Sitemap und interne Verlinkung jede Produktseite anderweitig erreichbar machen. Andernfalls kappen Sie den einzigen Crawl-Pfad zu einem Teil Ihres Katalogs.

### Eigene CSS-Selektoren

Ein Selektor pro Zeile. Kommas innerhalb einer Zeile sind ebenfalls zulässig. Jeder Link, der einem Selektor entspricht, wird obfuskiert.

```
#footer .account-links a
.block-tags a
.my-custom-block a[data-filter]
```

Der interne Konverter unterstützt Tag, ID, Klasse, Attribute (Vorhandensein oder exakter Wert), den Nachfahren-Kombinator und den Kombinator für direkte Kinder. Liegt `symfony/css-selector` im vendor-Verzeichnis Ihres Shops, nutzt das Modul es vorrangig und Ihnen steht die vollständige CSS-Syntax zur Verfügung.

### XPath-Zeilen

Für Selektionen, die CSS nicht ausdrücken kann, stellen Sie der Zeile `xpath:` voran:

```
xpath://div[@id='js-product-list']//a[contains(@href,'?order=')]
```

### Ausgeschlossene Controller

Kommagetrennte Liste von Front-Controller-Namen. Auf diesen Seiten findet keine Umschreibung statt und die Assets werden nicht geladen. Standardwert: `order,cart`. Ergänzen Sie jeden Controller, dessen Ablauf nicht von JavaScript abhängen darf.

## Wie die Umschreibung funktioniert

Über den Hook `actionOutputHTMLBefore` erhält das Modul das vollständige Seiten-HTML. Zunächst prüft es, ob es sich um ein komplettes HTML-Dokument handelt, wodurch AJAX- und JSON-Antworten ausgeschlossen sind. Anschließend lädt es das Dokument in DOMDocument, wandelt jeden Selektor in eine XPath-Abfrage um und ersetzt die gefundenen Links durch span-Elemente.

Jedes obfuskierte Element erhält:

- ein Attribut `data-o` mit der URL als umgekehrtes Base64;
- die Klasse `df-obf` zusätzlich zu den ursprünglichen Klassen;
- `tabindex="0"` und `role="link"` für die Barrierefreiheit;
- `data-t`, wenn der ursprüngliche Link ein target-Attribut trug.

Links, deren URL mit `#`, `mailto:`, `tel:` oder `javascript:` beginnt, werden übersprungen. Das Attribut `rel` wird entfernt, das Attribut `target` bleibt als `data-t` erhalten.

### Automatischer Rückfall

Schlägt die Dokumentanalyse fehl oder trifft kein Selektor auf einen Link zu, wird das ursprüngliche HTML unverändert zurückgegeben. Das Modul kann eine Seite also nicht durch unerwartetes Markup beschädigen.

### Per AJAX geladene Inhalte

Filteraktualisierung und unendliches Scrollen fügen nach dem ersten Rendering neue Links ein. Die Datei `front.js` installiert einen MutationObserver, der dieselben Selektoren browserseitig auf diese neuen Links anwendet. Die Selektoren werden über `Media::addJsDef` an das Frontend übergeben. XPath-Zeilen sind von diesem Mechanismus ausgenommen, da der Browser sie nicht auswertet.

## Überprüfen, ob es funktioniert

1. Öffnen Sie eine Kategorieseite mit Filtern und lassen Sie sich den Quelltext anzeigen (Strg+U, nicht den Element-Inspektor).
2. Suchen Sie nach `df-obf`: Dort, wo zuvor Filterlinks standen, sollten span-Elemente stehen.
3. Suchen Sie nach einer Filter-URL, etwa `?q=`: Sie darf in keinem href-Attribut mehr auftauchen.

Der Element-Inspektor zeigt das DOM nach der JavaScript-Ausführung, nicht das ausgelieferte HTML. Um das Ergebnis aus Crawler-Sicht zu beurteilen, nutzen Sie stets die Quelltextanzeige oder ein Werkzeug wie `curl`.

Testen Sie auf Navigationsseite den Linksklick, die mittlere Maustaste, Strg+Klick (Cmd+Klick unter macOS) und die Eingabetaste, nachdem Sie einen Filter per Tabulator erreicht haben.

## Fehlerbehebung

### Es wird nichts obfuskiert

Prüfen Sie der Reihe nach: Hauptschalter aktiv, mindestens ein Preset oder Selektor gesetzt, aktueller Controller nicht in der Ausschlussliste, PHP-Erweiterung DOM verfügbar. Leeren Sie anschließend den PrestaShop-Cache.

### Ein eigenes Theme wird nicht abgedeckt

Die Presets zielen auf die Selektoren des Classic-Themes. Untersuchen Sie bei einem individuellen Theme den Filterblock, notieren Sie ID oder Klasse des Containers und ergänzen Sie eine eigene Selektorzeile.

### Ein Link wurde versehentlich obfuskiert

Verengen Sie den Geltungsbereich des Selektors auf einen genaueren Container, oder entfernen Sie das betreffende Preset und ersetzen Sie es durch engere eigene Selektoren.

### Ein AJAX-Suchmodul verliert seine Links

Manche Drittmodule bauen ihren Filterblock vollständig neu auf. Weicht das Verhalten zwischen erster Anzeige und Aktualisierung ab, prüfen Sie, ob Ihr eigener Selektor auf den neu aufgebauten Container zielt und nicht auf ein Element, das bei jeder Aktualisierung zerstört wird.

## Häufige Fragen

### Ist das Cloaking?

Nein. Das ausgelieferte HTML ist für alle identisch: keine User-Agent-Prüfung, keine Seitenvariante. Der Link existiert im Quelltext für niemanden, und der Browser stellt ihn im Moment der Interaktion wieder her.

### Verschwinden bereits indexierte URLs?

Nein. Die Obfuskation wirkt auf das Entdecken neuer URLs. Für URLs, die bereits im Index sind, behalten Sie Ihre noindex-Anweisungen oder Weiterleitungen, bis Google sie erneut besucht.

### Welche Auswirkung auf die Performance?

Eine DOM-Analyse der fertigen Seite, im Bereich weniger Millisekunden auf einer üblichen Kategorieseite. Im Frontend 5 KB JavaScript und 0,2 KB CSS.

### Sollte man das Modul während eines SEO-Audits deaktivieren?

Nein, im Gegenteil: Das Audit soll abbilden, was Crawler sehen. Meldet Ihr Audit-Werkzeug einen Rückgang der internen Links auf Kategorieseiten, ist das genau das erwartete Ergebnis.
