Resposta curta
Se o canonical do seu site aponta pra projeto.vercel.app, pra um staging ou pra home, o Google pode indexar o endereço errado e esconder o certo. Quase sempre o domínio vem de uma variável de ambiente, como VERCEL_URL, que muda a cada deploy. Troque por um endereço fixo de produção, faça cada página apontar pra si mesma em URL absoluta e confira no Search Console qual canonical o Google escolheu.
O que o canonical faz (e o que ele não faz)
Quando o mesmo conteúdo responde em mais de um endereço, o Google escolhe um pra mostrar nos resultados. A tag canonical é como você diz qual prefere:
<link rel="canonical" href="https://seusite.com.br/produtos/tenis-azul">
Ela é uma sugestão forte, não uma ordem. O Google também olha redirects, links internos, o sitemap e se a página é https. Quando os sinais concordam, ele segue o canonical. Quando discordam, ele decide sozinho, e nem sempre a seu favor.
O perigo é quando a sugestão está errada e os outros sinais não são fortes o bastante pra desmenti-la. Aí o Google obedece: indexa o endereço que você apontou e deixa o seu de fora.
Os sinais de que o canonical está errado
- No Google, aparece
projeto.vercel.app(ou.netlify.app,.pages.dev,staging.) no lugar do seu domínio. - No Search Console, muitas páginas em "Página alternativa com tag canônica adequada". Esse status é normal pra versões duplicadas de verdade, mas não pras suas páginas principais.
- Páginas em "Duplicada, o Google escolheu uma canônica diferente da do usuário": o Google discordou de você.
- Só a home aparece no Google, e as páginas internas não entram nunca.
Como checar
- No código-fonte (Ctrl+U), procure
rel="canonical". O endereço tem que ser exatamente o da página aberta: mesmo domínio, mesmo protocolo, mesmo caminho. - No terminal, compare várias páginas de uma vez:
for p in / /sobre /blog /produtos/tenis-azul; do printf "%s -> " "$p" curl -s "https://seusite.com.br$p" | grep -io '<link[^>]*canonical[^>]*>' | grep -o 'href="[^"]*"' done - No cabeçalho. O canonical também pode vir como
Link: <https://...>; rel="canonical". Confira comcurl -sI. - Na Inspeção de URL do Search Console, compare o "URL canônico declarado pelo usuário" com o "URL canônico selecionado pelo Google". Se forem diferentes, o Google discordou, e vale entender por quê.
A ferramenta verificar canonical faz a mesma comparação pra você, página por página.
O caso do vercel.app
É o erro mais comum em sites Next.js hospedados na Vercel, e acontece porque o código monta o canonical com a variável errada:
// app/layout.tsx (errado)
export const metadata = {
metadataBase: new URL(`https://${process.env.VERCEL_URL}`),
};
VERCEL_URL é o endereço daquele deploy específico, algo como projeto-a1b2c3-time.vercel.app. Em produção, ela não é o seu domínio. Resultado: toda página declara como oficial um endereço de deploy que nem existe mais no próximo push.
O certo é usar um endereço fixo de produção:
// app/layout.tsx (certo)
const SITE = process.env.NEXT_PUBLIC_SITE_URL ?? "https://seusite.com.br";
export const metadata = {
metadataBase: new URL(SITE),
};
Defina NEXT_PUBLIC_SITE_URL só no ambiente de produção. Se preferir uma variável da própria Vercel, VERCEL_PROJECT_PRODUCTION_URL traz o domínio de produção do projeto, sem o https://. O mesmo raciocínio vale pra URL e DEPLOY_PRIME_URL na Netlify e CF_PAGES_URL na Cloudflare Pages: são endereços de deploy, não de produção.
O caso de todas as páginas apontando pra home
Outro clássico do Next.js. Alguém coloca o canonical no layout raiz, achando que vale só pra home:
// app/layout.tsx (errado: vale pra TODAS as páginas)
export const metadata = {
alternates: { canonical: "/" },
};
Como o layout é herdado, cada página do site passa a dizer que a versão oficial dela é a home. O Google conclui que só a home importa. A correção é declarar o canonical em cada página, com o próprio caminho:
// app/produtos/[slug]/page.tsx
export async function generateMetadata({ params }) {
const { slug } = await params;
return { alternates: { canonical: `/produtos/${slug}` } };
}
Com o metadataBase certo, o Next transforma esse caminho em URL absoluta. O mesmo erro aparece em temas de WordPress e em templates de outros frameworks que gravam o canonical fixo no cabeçalho do site.
Outros erros comuns
- Protocolo ou www trocados. O site responde em
https://seusite.com.br, mas o canonical dizhttp://www.seusite.com.br. No WordPress, confira Configurações › Geral: o "Endereço do WordPress" e o "Endereço do site" têm que ser o domínio final, com https. - Barra no final. O canonical diz
/sobre/, o site redireciona pra/sobre. A página oficial passa a ser um endereço que redireciona. Escolha um padrão e use em tudo. - Duas tags canonical. Tema e plugin de SEO adicionando uma cada, às vezes com valores diferentes. Com duas, o Google pode ignorar as duas.
- Canonical pra página que não pode ser indexada. Apontar pra uma URL com noindex, que dá 404 ou que está bloqueada no robots.txt manda sinais contraditórios.
- Paginação toda apontando pra página 1. A página 2 de uma categoria tem produtos diferentes da página 1, então ela deve apontar pra si mesma.
- Canonical relativo ou fora do
<head>. O Google aceita caminhos relativos, mas eles quebram fácil quando o site responde em mais de um domínio. E uma tag canonical no<body>é ignorada.
As regras de um canonical certo
| Regra | Exemplo certo |
|---|---|
| URL absoluta, com protocolo | https://seusite.com.br/sobre |
| Domínio de produção, nunca o de deploy | Nada de .vercel.app ou staging. |
| A própria página, salvo duplicata real | /sobre aponta pra /sobre |
| Endereço que responde 200, sem redirect | Mesmo padrão de barra e de www do site |
| Página indexável | Sem noindex e liberada no robots.txt |
Uma tag só, dentro do <head> | Sem duplicata de tema e plugin |
| Coerente com o sitemap e os links internos | O sitemap lista a mesma URL do canonical |
Depois de corrigir
Publique, confira o código-fonte em algumas páginas de cada tipo e rode a Inspeção de URL na home e nas páginas principais. O "URL canônico selecionado pelo Google" só muda quando o Google rastrear a página de novo, então peça indexação das mais importantes e reenvie o sitemap. Se o domínio de preview chegou a ser indexado, ele sai sozinho conforme o Google reprocessa as páginas, e ajuda se o preview mandar X-Robots-Tag: noindex, como a Vercel já faz.
Pra não depender de lembrar disso a cada deploy, a varredura grátis da Varrida confere o canonical de cada página da amostra e avisa quando ele aponta pra outro domínio ou falta.


