# Ofuscação de Ligações SEO para PrestaShop: documentação

> Este guia cobre a instalação, a configuração e a verificação do módulo dfobfuscator no PrestaShop 8 e 9. Instalação Vá a Módulos e Serviços, Carregar um módulo no seu back-office.…

- Página: <https://www.datafirefly.com/pt/documentation/dfobfuscator/>
- Idioma: pt
- Atualizado em: 2026-09-09
- Outros idiomas: [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), [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), [nl](https://www.datafirefly.com/nl/documentation/dfobfuscator/index.md)
- Índice: <https://www.datafirefly.com/pt/documentation/llms.txt>

Este guia cobre a instalação, a configuração e a verificação do módulo **dfobfuscator** no PrestaShop 8 e 9.

## Instalação

1. Vá a **Módulos e Serviços, Carregar um módulo** no seu back-office.
2. Coloque o ficheiro `dfobfuscator.zip` e confirme.
3. Clique em **Configurar** assim que a instalação terminar.

O módulo regista-se automaticamente em dois hooks: `actionOutputHTMLBefore` para a reescrita do HTML e `actionFrontControllerSetMedia` para o carregamento dos recursos do front-office. Não é criado qualquer override de ficheiro do core.

A extensão PHP `DOM` tem de estar ativa. Está-o por predefinição na quase totalidade dos alojamentos. Na sua ausência, o módulo mantém-se instalado mas deixa o HTML inalterado.

## Configuração

### Ativar a ofuscação

O interruptor principal desativa toda a reescrita sem desinstalar o módulo. Prático para comparar o código-fonte antes e depois, ou para isolar o módulo durante um diagnóstico.

### As três predefinições

| Predefinição | O que abrange | Predefinido |
| --- | --- | --- |
| Navegação por facetas | Os blocos de filtros e a lista de filtros ativos | Ativa |
| Ordenação dos produtos | O menu pendente de ordenação | Ativa |
| Paginação | As ligações para a página 2, 3 e seguintes | Inativa |

Só ative a paginação se o seu sitemap XML e as suas ligações internas tornarem cada ficha de produto acessível por outra via. Caso contrário, corta o único caminho de exploração para uma parte do seu catálogo.

### Seletores CSS personalizados

Um seletor por linha. As vírgulas na mesma linha também são aceites. Cada ligação correspondente a um seletor é ofuscada.

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

O conversor interno suporta a etiqueta, o identificador, a classe, os atributos (presença ou valor exato), o combinador descendente e o combinador de filho direto. Se a sua loja incluir `symfony/css-selector` na pasta vendor, o módulo dá-lhe prioridade e passa a dispor da sintaxe CSS completa.

### Linhas XPath

Para as seleções que o CSS não permite exprimir, prefixe a linha com `xpath:`:

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

### Controladores excluídos

Lista de nomes de controladores de front-office separados por vírgulas. Nessas páginas não há qualquer reescrita e os recursos não são carregados. Valor predefinido: `order,cart`. Acrescente qualquer controlador cujo percurso não deva depender de JavaScript.

## Como funciona a reescrita

No hook `actionOutputHTMLBefore`, o módulo recebe o HTML completo da página. Começa por verificar que se trata mesmo de um documento HTML inteiro, o que exclui as respostas AJAX e JSON. Depois carrega o documento em DOMDocument, converte cada seletor numa consulta XPath e substitui as ligações encontradas por elementos span.

Cada elemento ofuscado recebe:

- um atributo `data-o` com o URL em base64 invertido;
- a classe `df-obf` além das suas classes de origem;
- `tabindex="0"` e `role="link"` para acessibilidade;
- `data-t` quando a ligação original tinha um atributo target.

As ligações cujo URL começa por `#`, `mailto:`, `tel:` ou `javascript:` são ignoradas. O atributo `rel` é retirado e o atributo `target` é conservado sob a forma de `data-t`.

### Recurso automático

Se a análise do documento falhar, ou se nenhum seletor corresponder a uma ligação, o HTML de origem é devolvido sem alterações. O módulo não pode, por isso, partir uma página por causa de marcação inesperada.

### Conteúdo carregado por AJAX

A atualização dos filtros e o scroll infinito voltam a injetar ligações depois da apresentação inicial. O ficheiro `front.js` instala um MutationObserver que aplica os mesmos seletores a essas novas ligações, do lado do navegador. Os seletores são transmitidos ao front-office através de `Media::addJsDef`. As linhas XPath ficam excluídas deste mecanismo, uma vez que o navegador não as avalia.

## Verificar que está a funcionar

1. Abra uma página de categoria com filtros e mostre o código-fonte da página (Ctrl+U, não o inspetor de elementos).
2. Procure `df-obf`: deve encontrar elementos span no lugar das ligações de filtros.
3. Procure um URL de filtro, por exemplo `?q=`: já não deve aparecer num atributo href.

O inspetor de elementos mostra o DOM depois da execução do JavaScript, não o HTML servido. Para avaliar o resultado do lado do rastreador, use sempre a visualização do código-fonte ou uma ferramenta como o `curl`.

Do lado da navegação, teste o clique esquerdo, o clique no botão do meio, o ctrl+clique (cmd+clique no macOS) e a tecla Enter depois de chegar a um filtro com a tabulação.

## Resolução de problemas

### Nada é ofuscado

Verifique por esta ordem: o interruptor principal está ativo, há pelo menos uma predefinição ou um seletor preenchido, o controlador atual não consta da lista de exclusões e a extensão PHP DOM está disponível. Limpe depois a cache do PrestaShop.

### Um tema personalizado não fica coberto

As predefinições visam os seletores do tema Classic. Num tema à medida, inspecione o bloco de filtros para identificar o seu identificador ou a classe do contentor e acrescente uma linha de seletor personalizado.

### Uma ligação ofuscada por engano

Reduza o alcance do seletor visando um contentor mais preciso, ou retire a predefinição em causa e substitua-a por seletores personalizados mais estreitos.

### O módulo de pesquisa AJAX perde as suas ligações

Alguns módulos de terceiros reconstroem por completo o seu bloco de filtros. Se o comportamento diferir entre a primeira apresentação e a atualização, confirme que o seletor personalizado se aplica ao contentor reconstruído e não a um elemento destruído a cada atualização.

## Perguntas frequentes

### Isto é cloaking?

Não. O HTML servido é idêntico para todos: sem teste de user-agent e sem variantes de página. A ligação não existe para ninguém no código-fonte, e o navegador reconstitui-a no momento da interação.

### Os URL já indexados desaparecem?

Não. A ofuscação atua sobre a descoberta de novos URL. Para os URL já no índice, mantenha as suas diretivas noindex ou os seus redirecionamentos até que o Google os volte a visitar.

### Qual é o impacto no desempenho?

Uma análise DOM da página final, da ordem de alguns milissegundos numa página de categoria normal. Do lado do front-office, 5 KB de JavaScript e 0,2 KB de CSS.

### É preciso desativar o módulo durante uma auditoria SEO?

Não, pelo contrário: a auditoria deve refletir aquilo que os rastreadores veem. Se a sua ferramenta de auditoria assinalar uma queda no número de ligações internas nas páginas de categoria, é esse o resultado esperado.
