# Ofuscación de Enlaces SEO para PrestaShop

> Esta guía cubre la instalación, la configuración y la verificación del módulo dfobfuscator en PrestaShop 8 y 9. Instalación Vaya a Módulos y Servicios, Subir un módulo en su back-office.…

- Página: <https://www.datafirefly.com/es/documentation/dfobfuscator/>
- Idioma: es
- Actualizado el: 2026-07-28
- Otros idiomas: [fr](https://www.datafirefly.com/documentation/dfobfuscator/index.md), [en](https://www.datafirefly.com/en/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)
- Índice: <https://www.datafirefly.com/es/documentation/llms.txt>

Esta guía cubre la instalación, la configuración y la verificación del módulo **dfobfuscator** en PrestaShop 8 y 9.

## Instalación

1. Vaya a **Módulos y Servicios, Subir un módulo** en su back-office.
2. Suelte el archivo `dfobfuscator.zip` y confirme.
3. Haga clic en **Configurar** una vez terminada la instalación.

El módulo se registra en dos hooks: `actionOutputHTMLBefore` para la reescritura del HTML y `actionFrontControllerSetMedia` para la carga de los recursos del front. No se crea ningún override de archivos del core.

La extensión PHP `DOM` debe estar activa. Lo está por defecto en casi todos los alojamientos. Sin ella, el módulo permanece instalado pero deja el HTML sin cambios.

## Configuración

### Activar la ofuscación

El interruptor principal desactiva toda la reescritura sin desinstalar el módulo. Resulta útil para comparar el código fuente antes y después, o para aislar el módulo durante un diagnóstico.

### Los tres presets

| Preset | Qué selecciona | Por defecto |
| --- | --- | --- |
| Navegación por facetas | Los bloques de filtros y la lista de filtros activos | Activado |
| Ordenación de productos | El desplegable de ordenación | Activado |
| Paginación | Los enlaces a la página 2, 3 y siguientes | Desactivado |

Active la paginación solo si su sitemap XML y su enlazado interno hacen que cada ficha de producto sea accesible de otra forma. De lo contrario, corta la única vía de rastreo hacia una parte de su catálogo.

### Selectores CSS personalizados

Un selector por línea. También se aceptan comas en una misma línea. Cada enlace que coincida con un selector se ofusca.

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

El convertidor interno soporta la etiqueta, el identificador, la clase, los atributos (presencia o valor exacto), el combinador descendiente y el combinador de hijo directo. Si su tienda incluye `symfony/css-selector` en su vendor, el módulo lo usa de forma prioritaria y dispone entonces de la sintaxis CSS completa.

### Líneas XPath

Para las selecciones que el CSS no permite expresar, prefije la línea con `xpath:`:

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

### Controladores excluidos

Lista de nombres de controladores del front separados por comas. En esas páginas no se produce ninguna reescritura y los recursos no se cargan. Valor por defecto: `order,cart`. Añada cualquier controlador cuyo recorrido no deba depender de JavaScript.

## Cómo funciona la reescritura

En el hook `actionOutputHTMLBefore`, el módulo recibe el HTML completo de la página. Primero comprueba que se trata de un documento HTML entero, lo que descarta las respuestas AJAX y JSON. Después carga el documento en DOMDocument, convierte cada selector en una consulta XPath y sustituye los enlaces encontrados por elementos span.

Cada elemento ofuscado recibe:

- un atributo `data-o` con la URL en base64 invertido;
- la clase `df-obf` además de sus clases originales;
- `tabindex="0"` y `role="link"` para la accesibilidad;
- `data-t` cuando el enlace original llevaba un atributo target.

Los enlaces cuya URL empieza por `#`, `mailto:`, `tel:` o `javascript:` se ignoran. El atributo `rel` se elimina, el atributo `target` se conserva como `data-t`.

### Repliegue automático

Si el análisis del documento falla, o si ningún selector coincide con un enlace, se devuelve el HTML original sin modificar. El módulo no puede, por tanto, romper una página por un marcado inesperado.

### Contenido cargado por AJAX

La actualización de filtros y el scroll infinito reinyectan enlaces tras el renderizado inicial. El archivo `front.js` instala un MutationObserver que aplica los mismos selectores a esos nuevos enlaces, en el navegador. Los selectores se transmiten al front mediante `Media::addJsDef`. Las líneas XPath quedan excluidas de este mecanismo, ya que el navegador no las evalúa.

## Verificar que funciona

1. Abra una página de categoría con filtros y muestre el código fuente de la página (Ctrl+U, no el inspector de elementos).
2. Busque `df-obf`: debe encontrar elementos span donde antes había enlaces de filtro.
3. Busque una URL de filtro, por ejemplo `?q=`: ya no debe aparecer en un atributo href.

El inspector de elementos muestra el DOM tras la ejecución del JavaScript, no el HTML servido. Para juzgar el resultado desde el punto de vista del rastreador, use siempre el código fuente o una herramienta como `curl`.

En cuanto a la navegación, pruebe el clic izquierdo, el clic central, el ctrl+clic (cmd+clic en macOS) y la tecla Intro tras llegar a un filtro con el tabulador.

## Resolución de problemas

### No se ofusca nada

Compruebe por orden: el interruptor principal está activo, hay al menos un preset o un selector configurado, el controlador actual no está en la lista de exclusiones, la extensión PHP DOM está disponible. Después vacíe la caché de PrestaShop.

### Un tema personalizado no queda cubierto

Los presets apuntan a los selectores del tema Classic. En un tema a medida, inspeccione el bloque de filtros para anotar el identificador o la clase de su contenedor y añada una línea de selector personalizado.

### Un enlace ofuscado por error

Reduzca el alcance del selector apuntando a un contenedor más preciso, o retire el preset implicado y sustitúyalo por selectores personalizados más estrechos.

### Un módulo de búsqueda AJAX pierde sus enlaces

Algunos módulos de terceros reconstruyen por completo su bloque de filtros. Si el comportamiento difiere entre la primera visualización y la actualización, compruebe que su selector personalizado se aplica al contenedor reconstruido y no a un elemento destruido en cada actualización.

## Preguntas frecuentes

### ¿Esto es cloaking?

No. El HTML servido es idéntico para todos: sin prueba de user-agent, sin variante de página. El enlace no existe para nadie en el código fuente, y el navegador lo reconstruye en el momento de la interacción.

### ¿Desaparecen las URLs ya indexadas?

No. La ofuscación actúa sobre el descubrimiento de nuevas URLs. Para las URLs que ya están en el índice, mantenga sus directivas noindex o sus redirecciones hasta que Google las revisite.

### ¿Qué impacto tiene en el rendimiento?

Un análisis DOM de la página final, del orden de unos milisegundos en una página de categoría estándar. En el front, 5 KB de JavaScript y 0,2 KB de CSS.

### ¿Hay que desactivar el módulo durante una auditoría SEO?

No, al contrario: la auditoría debe reflejar lo que ven los rastreadores. Si su herramienta señala una caída del número de enlaces internos en las páginas de categoría, ese es el resultado esperado.
