Skip to main content
Validação HTML

Um elemento “link” não deve aparecer como descendente de um elemento “body” a menos que o elemento “link” tenha um atributo “itemprop” ou tenha um atributo “rel” cujo valor contenha “dns-prefetch”, “modulepreload”, “pingback”, “preconnect”, “prefetch”, “preload”, “prerender”, ou “stylesheet”.

Sobre este problema HTML

A especificação HTML restringe onde os elementos <link> podem aparecer com base no seu propósito. Links que carregam recursos necessários para renderização (como folhas de estilo e recursos pré-carregados) ou que transportam microdata (itemprop) são permitidos em <body> porque têm uma relação direta com o conteúdo ao seu redor. Outros tipos de elementos <link>—URLs canónicos, ícones, versões alternativas—são metadados de nível de documento e pertencem exclusivamente ao <head>.

Isto é importante por várias razões. Os browsers podem ignorar ou lidar de forma inconsistente com elementos <link> colocados em localizações inesperadas, levando a problemas como sinais canónicos em falta para motores de busca ou referências de favicon quebradas. A conformidade com os padrões também garante que o seu HTML é compatível com futuras versões e comporta-se de forma previsível em todos os browsers.

Causas comuns

Colocação direta em <body>

A causa mais direta é colocar um <link> de metadados diretamente dentro de <body>, frequentemente devido a um CMS, sistema de templates ou plugin que o injeta na localização errada.

Criação implícita de <body> pelo parser

Uma causa mais subtil ocorre quando um elemento que só é válido em <body> aparece dentro de <head>. Quando o parser HTML encontra tal elemento (como <img>, <div>, ou <p>), fecha implicitamente o <head> e abre o <body>. Quaisquer elementos <link> que se seguem são então tratados como descendentes de <body>, mesmo que pareçam estar dentro de <head> no seu código fonte.

Por exemplo, uma tag <img> no <head> faz com que o parser mude para contexto de body, então o subsequente <link rel="canonical"> é interpretado como estando dentro de <body> e desencadeia este erro.

Como corrigir

  1. Mover elementos <link> não permitidos para <head>: Se um <link> com rel="canonical", rel="icon", rel="alternate", ou valores similares estiver em <body>, mova-o para <head>.

  2. Verificar elementos exclusivos de body em <head>: Procure elementos como <img>, <div>, <p>, <script> (sem src), ou conteúdo de texto que possa ter sido acidentalmente colocado em <head>. Estes fazem com que o parser feche implicitamente o <head>, tornando tudo depois deles parte do <body>.

  3. Usar valores rel permitidos se a colocação em body for intencional: Se você genuinamente precisar de um <link> em <body>, certifique-se de que usa um dos valores rel permitidos (stylesheet, preload, prefetch, preconnect, dns-prefetch, modulepreload, pingback, prerender) ou tem um atributo itemprop.

Exemplos

<link rel="canonical"> colocado em <body>

<body>
  <link rel="canonical" href="https://example.com/page">
  <h1>Bem-vindo</h1>
</body>

✅ Movê-lo para <head>

<head>
  <title>A Minha Página</title>
  <link rel="canonical" href="https://example.com/page">
</head>
<body>
  <h1>Bem-vindo</h1>
</body>

❌ Uma <img> em <head> força contexto de body implícito

Mesmo que o <link> pareça estar em <head>, a <img> faz com que o parser mude para contexto de body:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Teste</title>
    <img src="photo.jpg" alt="Um gato sorridente">
    <link rel="canonical" href="https://example.com/">
  </head>
  <body>
    <p>Algum conteúdo</p>
  </body>
</html>

✅ Mover a <img> para <body> onde pertence

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Teste</title>
    <link rel="canonical" href="https://example.com/">
  </head>
  <body>
    <img src="photo.jpg" alt="Um gato sorridente">
    <p>Algum conteúdo</p>
  </body>
</html>

✅ Elementos <link> permitidos dentro de <body>

Estes são válidos porque usam valores rel permitidos:

<body>
  <article>
    <link rel="stylesheet" href="article-theme.css">
    <h2>Título do Artigo</h2>
    <p>Conteúdo aqui.</p>
  </article>
  <link rel="prefetch" href="/next-page.html">
  <link rel="preload" href="/font.woff2" as="font" type="font/woff2" crossorigin>
</body>

✅ Usar itemprop para microdata

Um <link> com um atributo itemprop também é válido dentro de <body>:

<body>
  <div itemscope itemtype="https://schema.org/Product">
    <span itemprop="name">Widget</span>
    <link itemprop="availability" href="https://schema.org/InStock">
  </div>
</body>

Encontre problemas como este automaticamente

O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.

Ajude-nos a melhorar os nossos guias

Este guia foi útil?

Pronto para validar os seus sites?
Comece o seu teste gratuito hoje.