Correção: "Couldn't Fetch Sitemap" no Google Search Console com Next.js (App Router)
Atualizado em 10 de outubro de 2025
Guia de solução de problemas de sitemap do Next.js para o Google Search Console
Se você tem se desesperado vendo o erro “Couldn’t fetch sitemap” no Google Search Console para o seu projeto Next.js, saiba que você não está sozinho. Esse frustrante erro de sitemap do Google Search Console pode impedir o Google de indexar seu site corretamente, prejudicando sua visibilidade. Muitos desenvolvedores usando o Next.js App Router encontraram esse desafio de solução de problemas de sitemap do Next.js, onde o GSC falha ao ler o sitemap, mesmo quando ele parece perfeitamente acessível no navegador.
Felizmente, a comunidade de desenvolvedores rastreou uma solução confiável. Este guia o orienta pelos passos exatos para correr o erro “Couldn’t fetch”, baseado em uma descoberta útil compartilhada em uma issue do GitHub do Next.js.
Vamos colocar seu sitemap indexado e seu site de volta aos trilhos. Para mais insights e discussão adicional, você também pode conferir minha resposta na issue do GitHub aqui.
O Problema: Por que o Google não consegue buscar o Sitemap?
O cerne da questão parece ser uma combinação de como o Next.js lida com roteamento e middleware, e como o Google Search Console armazena em cache suas tentativas de busca. Quando o GSC tenta acessar seu sitemap.xml, ele pode encontrar uma interferência — frequentemente do middleware — que faz a requisição falhar. Uma vez que falha, o GSC parece armazenar em cache esse resultado falho para aquela URL específica. Mesmo depois de corrigir o problema subjacente, simplesmente reenviar a mesma URL do sitemap.xml pode não disparar uma nova tentativa.
Como Corrigir o Erro “Couldn’t Fetch”
Esta solução vem do usuário do GitHub @segabrielcarvalho, que compartilhou uma abordagem prática que aborda caching, roteamento e conflitos de middleware com quatro passos chave.
Passo 1: Forçar uma Nova Busca do Sitemap com Trailing Slash
Este é o passo mais simples, mas mais crucial. O Google Search Console parece armazenar em cache tentativas de busca falhadas agressivamente. Para forçá-lo a tentar novamente com um estado limpo, você pode usar uma simples técnica de quebra de cache.
Em vez de enviar https://seu-site.com/sitemap.xml, adicione um trailing slash:
https://seu-site.com/sitemap.xml/
Enviar essa URL ligeiramente diferente ignorará o cache do GSC e disparará uma nova busca. Esse truque simples é frequentemente suficiente para fazer o sitemap ser lido com sucesso depois que você implementou as outras correções.
Passo 2: Servir seu Sitemap a partir de uma Rota Aninhada
Em vez de colocar seu arquivo sitemap.ts na raiz do seu diretório app, mova-o para uma pasta aninhada. Isso ajuda a isolá-lo e garantir que ele seja servido corretamente sem conflitos.
- Crie uma nova pasta
sitemapdentro do seu diretórioapp. - Mova seu arquivo
sitemap.ts(ousitemap.js) para dentro dela.
Seu novo caminho de arquivo será: app/sitemap/sitemap.ts
Isso muda a URL pública do seu sitemap. A nova URL será:
https://seu-site.com/sitemap/sitemap.xml
Lembre-se de usar essa nova URL quando enviá-la ao Google Search Console (com o truque do trailing slash!).
Passo 3: Excluir Arquivos de SEO do seu Middleware
O middleware é poderoso, mas também pode bloquear acidentalmente o Googlebot de acessar arquivos importantes como seu sitemap e robots.txt. Para evitar isso, você precisa atualizar seu middleware.ts para excluir explicitamente esses arquivos.
A configuração matcher no seu arquivo de middleware diz ao Next.js em quais caminhos o middleware deve rodar. Usando uma negative lookahead (lookahead negativo), você pode instruí-lo a rodar em todos os caminhos exceto por assets estáticos e arquivos de SEO.
Aqui está um exemplo de middleware que não faz nada, mas exclui corretamente os arquivos necessários. Você pode adaptar isso para o seu middleware existente.
import type { NextRequest } from "next/server";
import { NextResponse } from "next/server";
export default function middleware(req: NextRequest) {
// Sua lógica de middleware pode ir aqui.
// Se você não tem nenhuma outra lógica, apenas retorne next().
void req;
return NextResponse.next();
}
export const config = {
matcher: [
/*
* Combina todos os caminhos de requisição exceto os que começam com:
* - _next/static (arquivos estáticos)
* - _next/image (arquivos de otimização de imagem)
* - favicon.ico (arquivo favicon)
* - robots.txt (arquivo robots)
* - sitemap.xml (arquivo sitemap)
* - sitemap/ (arquivos de sitemap aninhados)
* - site.webmanifest (arquivo web manifest)
*/
"/((?!_next/static|_next/image|favicon\\.ico|robots\\.txt|sitemap\\.xml|sitemap/.*|site\\.webmanifest).*)",
],
};
Essa configuração garante que seu robots.txt e ambos os caminhos potenciais de sitemap (/sitemap.xml e /sitemap/sitemap.xml) nunca sejam processados pelo middleware, evitando quaisquer blocos ou redirecionamentos potenciais que possam confundir o Googlebot.
Passo 4: Criar um Arquivo robots.txt Correto
Finalmente, garanta que você tem um arquivo robots.txt limpo e correto no seu diretório app. Este arquivo deve permitir explicitamente todos os user agents e apontar para a sua nova URL de sitemap. Se você tinha um robots.txt na sua pasta public, é melhor removê-lo para evitar conflitos e confiar apenas no que é gerado a partir do seu diretório app.
Crie um arquivo chamado robots.ts ou robots.txt no seu diretório app com o seguinte conteúdo:
import { MetadataRoute } from 'next'
export default function robots(): MetadataRoute.Robots {
return {
rules: {
userAgent: '*',
allow: '/',
},
sitemap: 'https://seu-site.com/sitemap/sitemap.xml',
}
}
Ou, se preferir um arquivo estático:
User-agent: *
Allow: /
Sitemap: https://seu-site.com/sitemap/sitemap.xml
Certifique-se de substituir https://seu-site.com pelo seu domínio real. Este arquivo direciona os rastreadores para a nova localização do seu sitemap.
Principais Pontos
Para resumir a correção:
- Use um trailing slash (
/) na sua URL de sitemap ao enviar para o GSC para quebrar o cache. - Mova seu arquivo de sitemap para uma rota aninhada como
app/sitemap/sitemap.ts. - Atualize seu middleware para excluir arquivos de SEO como
robots.txtesitemap.xml. - Aponte seu
robots.txtpara a nova URL do sitemap.
Além disso, é importante garantir que você tenha apenas uma fonte para o seu sitemap. Se você tem um sitemap.xml na sua pasta public e também está gerando um a partir do seu diretório app, conflitos podem surgir. Exclua quaisquer arquivos de sitemap antigos e fique com um único, gerado dinamicamente.
Seguindo esses passos, você deve ser capaz de resolver o erro “Couldn’t fetch sitemap” e fazer seu site Next.js ser indexado corretamente pelo Google. Boa entrega!