Przejdź do treści

Wzorzec · TypeScript

robots.txt i metadane robots w Next.js App Router

Statyczny robots przez app/robots.ts i punktowy noindex przez generateMetadata.

Poziom: podstawowySzacunek czasu: ~25 min

Reguły globalne — w robots.ts; zakaz indeksowania szkiców — w metadata konkretnej trasy.

  • Nie duplikuj sprzecznych sygnałów między robots.txt a meta robots
  • sitemap w robots musi być kanoniczny
  • dla preview często potrzebny pełny noindex

Robot indeksujący czyta zarówno robots.txt, jak i <meta name="robots">. Rozdzielaj: plik — ogólne zasady, meta — strony, które nie powinny trafić do indeksu.

Kod

app/robots.ts w tym projekcie:

import type { MetadataRoute } from 'next'
import { getSiteUrl } from '@/lib/site'

const host = getSiteUrl().replace(/\/$/, '')

export default function robots(): MetadataRoute.Robots {
  return {
    rules: [
      { userAgent: '*', allow: '/' },
      { userAgent: 'GPTBot', allow: '/' },
      { userAgent: 'Google-Extended', allow: '/' },
      { userAgent: 'CCBot', allow: '/' },
      { userAgent: 'anthropic-ai', allow: '/' },
      { userAgent: 'Claude-Web', allow: '/' },
      { userAgent: 'ClaudeBot', allow: '/' },
      { userAgent: 'PerplexityBot', allow: '/' },
      { userAgent: 'Applebot-Extended', allow: '/' },
    ],
    sitemap: `${host}/sitemap.xml`,
    host,
  }
}

Punktowy noindex w generateMetadata szkicu lub strony pomocniczej:

import type { Metadata } from 'next'

export async function generateMetadata(): Promise<Metadata> {
  return {
    title: 'Szkic',
    robots: { index: false, follow: false },
  }
}

Weryfikacja

  • GET /robots.txt zwraca odpowiedź tekstową: reguły User-agent, ewentualnie Disallow, jedna linia Sitemap: z kanonicznym HTTPS-URL mapy witryny.
  • Na zamkniętych stronach w HTML jest noindex i nie trafiają do sitemap (jeśli polityka to pełne wykluczenie z indeksu).

Źródła

Wdrożyć pod Twoją domenę i stack?

Krótki formularz: imię, telefon, strona. Po wysłaniu — odpowiedź z kolejnością prac i orientacją etapów; szczegóły doprecyzujemy na kontakcie.