Skip to main content

Sobre este problema HTML

O elemento <head> é o contentor para metadados do documento — coisas como o <title>, tags <meta>, elementos <link>, e referências <script>. De acordo com a especificação HTML, o <head> deve ser o primeiro elemento filho de <html> e deve aparecer exatamente uma vez. Quando o parser do navegador encontra uma segunda tag <head>, ou uma tag <head> após o <body> já ter sido aberto, trata-a como uma tag de abertura “perdida” porque viola a estrutura esperada do documento.

Este problema surge comumente em várias situações:

  • Secções <head> duplicadas — frequentemente causadas por erros de copiar-colar, inclusões de template, ou renderização do lado do servidor que injeta um segundo bloco <head>.
  • <head> colocado dentro de <body> — isto pode acontecer ao reestruturar uma página ou quando um componente ou template parcial inclui incorretamente o seu próprio <head>.
  • Tags de fecho em falta ou mal colocadas — se se esquecer de fechar o <head> com </head> ou fechar acidentalmente <html> cedo demais, tags subsequentes podem acabar em posições inesperadas.

Isto importa porque os navegadores lidam com tags <head> perdidas de forma inconsistente. A maioria dos navegadores modernos irá ignorar silenciosamente um segundo <head> e tentar processar os seus filhos como se fossem parte do <body>, o que significa que os seus metadados (como declarações <meta> charset, folhas de estilo, ou scripts) podem não ser reconhecidos adequadamente. Isto pode levar a styling quebrado, problemas de codificação, metadados SEO em falta, e comportamento imprevisível entre diferentes navegadores.

Exemplos

Secções <head> duplicadas

Um erro comum é ter dois blocos <head> no mesmo documento:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>My Page</title>
  </head>
  <head>
    <meta name="description" content="My description">
  </head>
  <body>
    <p>Hello world</p>
  </body>
</html>

O segundo <head> desencadeia o erro de tag de abertura perdida. Una tudo num único <head>:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>My Page</title>
    <meta name="description" content="My description">
  </head>
  <body>
    <p>Hello world</p>
  </body>
</html>

<head> colocado dentro de <body>

Isto acontece frequentemente quando um template parcial ou componente inclui o seu próprio <head>:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>My Page</title>
  </head>
  <body>
    <head>
      <link rel="stylesheet" href="extra.css">
    </head>
    <p>Hello world</p>
  </body>
</html>

Mova os metadados para a secção <head> existente:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>My Page</title>
    <link rel="stylesheet" href="extra.css">
  </head>
  <body>
    <p>Hello world</p>
  </body>
</html>

<head> aparecendo após <body>

Por vezes um <head> acaba após a tag de fecho </body>, particularmente em páginas montadas dinamicamente:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>My Page</title>
  </head>
  <body>
    <p>Hello world</p>
  </body>
  <head>
    <meta charset="utf-8">
  </head>
</html>

Novamente, a correção é consolidar tudo no único <head> corretamente colocado:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>My Page</title>
  </head>
  <body>
    <p>Hello world</p>
  </body>
</html>

Dica para sistemas baseados em templates

Se você usa um motor de templates, gerador de sites estáticos, ou CMS, verifique que apenas o seu layout base define o elemento <head>. Parciais e componentes devem injetar conteúdo no <head> existente usando o mecanismo de bloco ou slot do sistema de templates, em vez de envolver os seus metadados numa nova tag <head>. Procure no output HTML final renderizado por todas as ocorrências de <head para verificar que existe apenas uma.

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.