# Verificador de ligações mortas: documentação

> Instalação Pré-requisitos PrestaShop 8.0 a 9.x PHP 7.4 no mínimo, 8.1 ou superior recomendado Extensão PHP cURL para a verificação HTTP Extensão PHP DOM recomendada para a extração das ligações…

- Página: <https://www.datafirefly.com/pt/documentation/dfbrokenlinks/>
- Idioma: pt
- Atualizado em: 2026-09-09
- Outros idiomas: [fr](https://www.datafirefly.com/documentation/dfbrokenlinks/index.md), [en](https://www.datafirefly.com/en/documentation/dfbrokenlinks/index.md), [es](https://www.datafirefly.com/es/documentation/dfbrokenlinks/index.md), [de](https://www.datafirefly.com/de/documentation/dfbrokenlinks/index.md), [it](https://www.datafirefly.com/it/documentation/dfbrokenlinks/index.md), [pl](https://www.datafirefly.com/pl/documentation/dfbrokenlinks/index.md), [nl](https://www.datafirefly.com/nl/documentation/dfbrokenlinks/index.md)
- Índice: <https://www.datafirefly.com/pt/documentation/llms.txt>

## Instalação

### Pré-requisitos

- PrestaShop 8.0 a 9.x
- PHP 7.4 no mínimo, 8.1 ou superior recomendado
- Extensão PHP cURL para a verificação HTTP
- Extensão PHP DOM recomendada para a extração das ligações (existe um recurso por expressões regulares se ela faltar)

### Instalar o módulo

1. Obtenha o `dfbrokenlinks.zip` a partir da sua conta de cliente.
2. Vá a **Módulos, Gestor de módulos, Carregar um módulo** e coloque o ZIP. Também pode enviar a pasta `dfbrokenlinks/` para `/modules/` por FTP.
3. Clique em **Instalar**.

A instalação cria quatro tabelas SQL (`ps_dfbl_scan`, `ps_dfbl_url`, `ps_dfbl_occurrence`, `ps_dfbl_ignore`) e um separador de back-office.

### Onde o encontrar

O scanner está acessível em **Catálogo, Ligações e imagens mortas**. A página de configuração do módulo, no gestor de módulos, mostra um resumo da última análise e um botão que remete para o scanner.

**Sem impacto no front-office.** O módulo não regista qualquer hook de front-office. Não altera os seus templates nem a apresentação da sua loja. Tudo se passa no back-office.

## Executar uma primeira análise

Abra **Catálogo, Ligações e imagens mortas** e clique em **Executar uma nova análise**. As definições predefinidas servem à maioria das lojas, podendo afiná-las depois.

### As duas fases

Uma análise decorre em dois tempos:

1. **Recolha.** O módulo percorre os conteúdos que assinalou, extrai cada ligação e cada imagem, elimina os URL duplicados e verifica no disco os ficheiros de imagem referenciados na base de dados.
2. **Verificação.** Os URL restantes são consultados por HTTP, vários em paralelo, para obter o respetivo código de resposta.

O navegador comanda o avanço através de chamadas sucessivas. Cada chamada trabalha durante o tempo definido nas definições (12 segundos por predefinição), grava a sua posição na base de dados e devolve o controlo. É isto que permite tratar um catálogo grande sem nunca ultrapassar o `max_execution_time`.

### Acompanhar o progresso

A barra de progresso mostra a fase em curso. Durante a verificação, um contador indica o número de URL já testados face ao total recolhido. Os seis indicadores por baixo da barra vão sendo atualizados.

### Parar e retomar

O botão **Parar** interrompe a análise de forma limpa. Fechar o separador do navegador tem o mesmo efeito, sem perdas: a posição é gravada na base de dados depois de cada lote. Uma análise parada conserva os resultados já obtidos, consultáveis na tabela.

**Primeira análise.** Execute-a fora das horas de ponta, sobretudo se deixar ativa a verificação dos URL internos: esses pedidos recaem no seu próprio servidor.

## Definições

O painel **Definições da análise**, recolhido por predefinição, abre-se pelo ícone no canto superior direito do bloco.

### Conteúdos a analisar

Cada caixa corresponde a uma origem. As origens marcadas com um emblema de _ficheiros_ não geram qualquer pedido HTTP: verificam a presença dos ficheiros no disco.

- **Produtos**: descrição, descrição curta, mensagens de disponibilidade com e sem stock
- **Categorias**: descrição e `additional_description`, se a sua versão do PrestaShop tiver essa coluna
- **Páginas CMS**: conteúdo
- **Categorias CMS**: descrição
- **Marcas**: descrição e descrição curta
- **Fornecedores**: descrição
- **Lojas**: nota, morada linha 1 e linha 2
- **Blocos de ligações do rodapé**: conteúdo personalizado do módulo `ps_linklist`
- **Ficheiros de imagem de produtos**: presença em `img/p/`
- **Ficheiros de imagem de categorias, marcas, fornecedores e lojas**: presença em `img/c/`, `img/m/`, `img/su/` e `img/st/`
- **Ficheiros anexos de produtos**: presença na pasta `download/`

Uma origem cuja tabela não exista na sua instalação, por exemplo os blocos de ligações se o `ps_linklist` estiver ausente, simplesmente não aparece na lista.

### Idiomas

Por predefinição, são analisados todos os idiomas ativos. Desmarcar idiomas reduz o tempo de recolha, mas deixa ligações por verificar nas traduções excluídas. É útil numa primeira passagem rápida, a repetir depois com cobertura completa.

**Numa loja multi-idioma.** As ligações internas colocadas nas descrições portuguesas devem apontar para o prefixo `/pt/`. Um erro frequente numa loja traduzida a partir do francês é a descrição portuguesa conservar as ligações francesas: elas respondem 200 e não aparecem como mortas, mas atiram o visitante português para a versão francesa. Ordene os resultados por origem e percorra a coluna do idioma para as detetar.

### Opções de HTTP

- **Tempo de espera**: tempo máximo concedido a uma resposta completa. 10 segundos por predefinição. Para lá disso, o URL é contado como morto, com uma mensagem de tempo excedido.
- **Tempo de ligação**: tempo máximo para estabelecer a ligação. 5 segundos por predefinição. Um domínio cujo DNS já não resolve falha aqui.
- **Pedidos em paralelo**: de 1 a 20, 6 por predefinição. Aumentar acelera a análise, mas eleva a carga de saída e o risco de limitação de débito nos servidores remotos.
- **Verificar os URL internos**: ativo por predefinição. Os URL locais que apontam para um ficheiro estático presente no disco são de qualquer modo validados sem pedido de rede, pelo que esta opção só diz respeito aos URL que passam pelo router do PrestaShop.
- **Verificar os URL externos**: ativo por predefinição. Desativá-lo dá uma análise muito rápida, limitada aos seus próprios conteúdos.
- **Seguir os redirecionamentos**: ativo por predefinição, com um máximo de cinco saltos. O código final passa a ser o do destino.
- **Assinalar os URL redirecionados como avisos**: ativo por predefinição. Um URL que responde 200 depois de um redirecionamento aparece como aviso, o que permite identificar as ligações a atualizar mesmo quando ainda funcionam.
- **Verificar os certificados SSL**: inativo por predefinição. Ative-o se quiser detetar certificados expirados, sabendo que alguns servidores mal configurados passarão então a aparecer como erro.
- **Analisar apenas os elementos ativos**: inativo por predefinição. Uma vez assinalado, os produtos e categorias desativados saem do âmbito.
- **User agent**: cadeia enviada no cabeçalho. Alguns sites respondem 403 aos robôs identificados. Substituir o valor pelo de um navegador recente resolve boa parte destes casos.

### Cadência e lotes

**Segundos de processamento por lote** define o tempo de trabalho de cada chamada. 12 segundos por predefinição. Este valor deve ficar claramente abaixo do `max_execution_time` do seu alojamento, com margem de segurança.

**Atenção.** Se o seu alojamento limitar os scripts a 30 segundos, não suba este valor acima de 20. O módulo para no fim de um pedido HTTP em curso, e não a meio, pelo que é preciso deixar margem para o último lote.

### URL excluídos

Um padrão por linha. Há três escritas possíveis:

- **Texto simples**: correspondência por subcadeia. `staging.odominio.pt` exclui todos os URL que contenham essa cadeia.
- **Caracteres universais**: `*` substitui qualquer sequência de caracteres e `?` um único. `https://*.parceiro.tld/*` exclui todos os subdomínios do parceiro.
- **Expressão regular**: prefixo `re:`. O padrão é aplicado tal como está, sem delimitadores.

Exemplo de lista típica:

```
localhost
127.0.0.1
staging.odominio.pt
https://*.rede-parceira.tld/*
re:^https://[a-z0-9-]+[.]cdn-interno[.]net/
```

Escrever um ponto literal na forma `[.]` numa expressão regular evita problemas de escape e equivale à forma com barra invertida.

Os URL excluídos aparecem na tabela com o estado _ignorado_ e não consomem qualquer pedido.

## Ler os resultados

### Os seis indicadores

- **URL encontrados**: número de URL únicos recolhidos em todas as origens
- **Mortos**: URL e ficheiros em falha, de todas as categorias
- **Avisos**: casos a observar sem urgência
- **Imagens mortas**: entre os mortos, os detetados numa etiqueta de imagem de um conteúdo
- **Ficheiros em falta**: entre os mortos, os ficheiros ausentes do disco
- **Válidos**: tudo o que responde corretamente

### Os estados

- **Válido**: código 2xx, ou ficheiro local presente no disco
- **Aviso**: redirecionamento, 401, 403, 429, ou URL alcançado depois de redirecionamento quando a opção correspondente está ativa
- **Morto**: 404, 410, outros 4xx, 5xx, tempo excedido, erro de DNS, ligação recusada, ou ficheiro ausente do disco
- **Ignorado**: URL abrangido pelas suas exclusões, ou colocado na lista de ignorados a partir da tabela
- **Não testado**: URL de uma categoria desativada nas definições, interna ou externa

A tabela está ordenada por gravidade decrescente e depois por número de utilizações. Os problemas mais espalhados pelo catálogo aparecem, por isso, no topo.

### Filtros e pesquisa

O filtro de estado está em **Apenas problemas** na abertura, o que combina mortos e avisos. Os outros filtros incidem sobre o tipo de recurso (ligação, imagem, ficheiro local) e sobre a origem. O campo de pesquisa consulta ao mesmo tempo o URL e a mensagem de erro, o que permite, por exemplo, isolar todos os `Connection timed out` de uma vez.

### Detalhe dos locais

O ícone em forma de olho abre a lista dos conteúdos que usam o URL. Cada linha indica:

- o tipo de origem (Produtos, Páginas CMS, Marcas...)
- o nome do elemento e o seu identificador
- o campo em causa (`description`, `description_short`, `content`...)
- o idioma
- o texto âncora da ligação, ou o atributo alt de uma imagem
- um botão **Modificar**, que abre a ficha num novo separador

Um URL presente em 34 fichas de produto aparece numa só linha da tabela, com 34 locais no detalhe. Vê imediatamente a dimensão do problema antes de começar a corrigir.

## Corrigir

### Ligações mortas num conteúdo

Abra o detalhe, clique em **Modificar** no local a tratar, corrija ou retire a ligação no editor e grave. Se o mesmo URL aparecer em vários idiomas do mesmo produto, cada idioma é listado separadamente: o PrestaShop guarda um conteúdo por idioma, pelo que é preciso corrigir cada versão.

### Ficheiros de imagem em falta

Estas linhas mostram um caminho em vez de um URL, por exemplo `img/p/4/2/9/429.jpg`. O ficheiro está ausente, mas a base de dados ainda o referencia. Há três saídas possíveis:

1. O ficheiro existe numa cópia de segurança: reponha-o no local indicado.
2. A imagem já não existe: elimine-a no separador Imagens do produto, para que a base deixe de a referenciar, e carregue depois uma imagem de substituição.
3. Faltam também as miniaturas: depois da reposição ou do novo carregamento, gere de novo as miniaturas em **Design, Definições das imagens**.

**Formatos de imagem.** Desde o PrestaShop 8.1, uma imagem pode existir em JPEG, WebP ou AVIF, consoante a definição `PS_IMAGE_FORMAT`. O módulo considera o ficheiro presente assim que encontra uma das extensões jpg, jpeg, png, webp, avif ou gif. Um ficheiro só é assinalado como em falta se nenhuma dessas variantes existir.

### Voltar a verificar um URL

O ícone de atualização volta a verificar uma única linha. O estado e o código são atualizados no lugar, sem relançar a análise completa. É prático depois de corrigir uma página do lado do parceiro ou de repor um ficheiro em linha.

### Ignorar um URL

O ícone de proibição acrescenta o URL à lista de ignorados. Desaparece da tabela e deixa de ser assinalado nas análises seguintes. A lista de ignorados é conservada independentemente das análises, pelo que sobrevive à limpeza automática.

## Exportação CSV

O botão **Exportar em CSV** exporta o conjunto de resultados tal como está filtrado no ecrã. O ficheiro usa o ponto e vírgula como separador e começa por um BOM UTF-8, o que permite ao Excel abrir diretamente os acentos sem passar pelo assistente de importação.

Colunas exportadas: URL, tipo, âmbito, estado, código HTTP, erro, redirecionamento, tempo de resposta em milissegundos, número de utilizações, origens e elementos em causa.

## Catálogos grandes e desempenho

### O que custa tempo

A recolha é rápida: lê a base de dados e analisa HTML. O tempo da análise vem quase todo da verificação HTTP e, mais concretamente, do tempo de resposta dos servidores remotos. Há dois mecanismos que limitam a fatura:

- **Eliminação de duplicados.** Um URL presente 400 vezes é testado uma vez. Num catálogo em que a mesma ligação para o guia de tamanhos é copiada para todas as fichas, a diferença é considerável.
- **Validação local.** Um URL do seu domínio que aponte para um ficheiro estático existente é validado por leitura do sistema de ficheiros, sem pedido de rede. Isto cobre a maioria das imagens das descrições.

### Definições sugeridas conforme a dimensão

- **Menos de 500 produtos**: definições predefinidas, sem alterações.
- **500 a 5000 produtos**: 6 a 8 pedidos em paralelo e 12 a 15 segundos por lote.
- **Mais de 5000 produtos**: comece por uma análise com os URL externos desativados, para tratar primeiro as suas próprias ligações e imagens, e volte depois a lançar uma análise completa fora das horas de atividade.

### Alojamento partilhado

Num alojamento partilhado, baixe os pedidos em paralelo para 2 ou 3 e mantenha 10 segundos por lote. Se notar uma lentidão no front-office durante a análise, desative a verificação dos URL internos: os ficheiros estáticos locais continuam a ser controlados no disco, e só perde o teste dos URL que passam pelo router.

## Multiloja

O âmbito da análise segue o contexto de loja selecionado na barra superior do back-office. As tabelas com uma coluna de identificador de loja, como `ps_product_lang` ou `ps_category_lang`, são filtradas em conformidade. Para cobrir uma rede de três lojas, execute três análises, mudando de contexto entre cada uma.

## Resolução de problemas

### A análise fica bloqueada na fase de recolha

A recolha não mostra um contador detalhado, pelo que pode parecer parada num catálogo muito grande quando na verdade está a avançar. Verifique o separador de rede do navegador: devem suceder-se chamadas a cada doze segundos, aproximadamente. Se uma chamada devolver um erro 500, reduza o tempo de processamento por lote e volte a lançar.

### Muitos 403 em ligações que funcionam no navegador

A Cloudflare e as proteções anti-robô bloqueiam os pedidos que não são identificados como um navegador. Substitua o user agent pelo de um Chrome ou Firefox recente. Se o domínio continuar bloqueado, acrescente-o às exclusões: não é uma ligação morta, é uma ligação impossível de verificar a partir de um script.

### Erro SSL certificate problem

O certificado do site remoto não é validado pelo arquivo de certificados do seu servidor. Se não precisar de controlar os certificados, desmarque **Verificar os certificados SSL**. Se a mensagem disser respeito ao seu próprio domínio, é um problema real a tratar do lado do servidor.

### Todos os URL internos aparecem como erro

O seu servidor não consegue chamar-se a si próprio, um caso frequente atrás de um proxy inverso ou com uma resolução de DNS interna particular. Desmarque **Verificar os URL internos**. Os ficheiros de imagem em falta e as ligações externas continuam a ser detetados normalmente.

### Há imagens assinaladas como em falta apesar de aparecerem

Verifique o caminho indicado na tabela. Se o ficheiro existir mesmo nesse local, a causa é quase sempre uma restrição de leitura do PHP: verifique as permissões da pasta `img/` e a diretiva `open_basedir`.

### A faixa indica que o cURL não está disponível

A extensão PHP cURL não está instalada no seu alojamento. Peça a sua ativação ao alojamento. Entretanto, o módulo continua utilizável para os ficheiros de imagem em falta no disco, que não passam pela rede.

## Referência técnica

### Tabelas SQL

- `ps_dfbl_scan`: um registo por análise, com a fase, a posição de retoma e os contadores
- `ps_dfbl_url`: os URL únicos de uma análise, com a impressão, o estado e o resultado HTTP
- `ps_dfbl_occurrence`: os locais, ligados a um URL e a um conteúdo do catálogo
- `ps_dfbl_ignore`: a lista de ignorados, independente das análises

Só são conservadas as três últimas análises. Ao lançar uma nova, as mais antigas são eliminadas, com os respetivos URL e locais.

### Atributos extraídos

O módulo lê os seguintes atributos no HTML dos seus conteúdos:

- etiqueta a: `href`
- etiqueta area: `href`
- etiqueta img: `src`, `data-src`, `data-original`, `data-lazy`, `srcset`
- etiquetas source e video: `src`, `srcset`, `poster`
- etiquetas audio, iframe e embed: `src`
- etiqueta object: `data`
- etiquetas link e script: `href`, `src`
- atributo `style`: os `background-image: url(...)`

São postos de lado antes de qualquer verificação: `mailto:`, `tel:`, `sms:`, `callto:`, `javascript:`, os URI de dados, as âncoras isoladas, os esquemas que não sejam HTTP e HTTPS, e qualquer valor com chavetas ou parênteses retos, que sinalizam restos de Smarty ou de shortcode.

Os URL relativos são resolvidos contra o URL de base da loja, respeitando os segmentos `.` e `..`. Os URL sem protocolo, começados por duas barras, herdam o esquema da loja. O fragmento a seguir ao cardinal é retirado antes do pedido.

### Controlador e arquitetura

Um único controlador de administração, `AdminDfBrokenLinks`, expõe a página e os pontos de entrada AJAX. O módulo não declara qualquer hook. As classes são carregadas por inclusão direta, sem Composer nem dependências externas.

## Desinstalação

No gestor de módulos, desinstale o **Broken Links & Images Checker**. As quatro tabelas, o separador de back-office e todas as chaves de configuração são eliminados.

**A lista de ignorados vai com ele.** A tabela `ps_dfbl_ignore` é eliminada na desinstalação. Se tiver construído uma longa lista de exclusões manuais, exporte-a ou copie o campo dos URL excluídos antes de desinstalar.

## Perguntas frequentes

### O módulo altera os meus conteúdos?

Não. Lê os seus conteúdos e só escreve nas suas próprias tabelas. Todas as correções passam pelo back-office normal do PrestaShop.

### Posso agendar uma análise automática?

A versão 1.0.0 lança as análises a partir do back-office, com o navegador como maestro. Não há tarefa de cron. Na prática, uma análise mensal lançada manualmente chega para a maioria dos catálogos.

### Porque é que um URL aparece como aviso apesar de responder 200?

Porque foi alcançado depois de um redirecionamento e a opção **Assinalar os URL redirecionados como avisos** está ativa. A ligação funciona, mas obriga os visitantes e o Google a um salto desnecessário. É preferível colocar diretamente o URL de destino no conteúdo.

### O módulo deteta as ligações em módulos de terceiros?

Analisa os conteúdos guardados nas tabelas padrão do PrestaShop e os blocos de ligações do `ps_linklist`. Um módulo de terceiros que guarde os seus próprios textos nas suas próprias tabelas não está coberto.

### As análises consomem largura de banda?

Cada verificação começa por um pedido HEAD, que só obtém os cabeçalhos. O recurso ao GET, usado quando o servidor remoto recusa o HEAD, limita a transferência aos dois primeiros kilobytes. O volume é marginal.

### Quantas análises são conservadas?

As três últimas. Isso permite comparar um estado antes e depois da correção sem deixar a base de dados crescer indefinidamente.

### O módulo é compatível com o RGPD?

Não guarda qualquer dado pessoal: apenas URL, códigos HTTP e referências aos seus conteúdos. Nenhum dado é transmitido à DataFirefly.
