StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Doradztwo produktowe

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Doradztwo produktowe

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Doradztwo produktowe

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

RealizacjeO mnieBlog
Porozmawiajmy
PL
EN

Nowoczesne strony internetowe dla firm, które myślą odważnie.

Przewiń do góry

Nazwa

StriveLab Maciej Sala

NIP

6772218995

REGON

524008527

E-mail

contact@strivelab.pl

Usługi główne
  • Tworzenie stron internetowych
  • Strony internetowe Next.js
  • Strony internetowe Astro
  • Strony internetowe React
Inne usługi
  • Usługi
  • SEO & Performance Sprint
  • QA & Stabilizacja
  • Konsultacje Product / Delivery
  • Automatyzacja Procesów AI
  • Aplikacje webowe Next.js
  • Współpraca ciągła
Strony
  • O mnie
  • Usługi
  • Realizacje
  • Blog

© 2026 StriveLab.pl

Polityka prywatności
Next.jsSEO

Next.js Sitemap i robots.txt — automatyczna generacja z App Routera

Jak generować sitemap.xml i robots.txt w Next.js App Router? Natywne API konwencji plików vs next-sitemap — dynamiczne sitemaps, lastmod, changefreq i priorytety.

OpublikujLinkedInFacebookWyślij
Autor
Maciej Sala
Opublikowano
10 kwietnia 2026 14:30
Czytanie
4 min czytania
Aktualizacja
25 maja 2026 10:55

Dlaczego sitemap i robots.txt są ważne?

Next.js App Router oferuje natywne API (bez zewnętrznych bibliotek) do generowania obu plików. W tym artykule pokazuję, jak zrobić to konwencjami app/sitemap.ts i app/robots.ts, kiedy wystarczy natywne rozwiązanie, a kiedy warto sięgnąć po next-sitemap.

Artykuł w skrócie

  • Natywne app/sitemap.ts — App Router generuje sitemapę bezpośrednio z kodu TypeScript; bez zewnętrznych bibliotek dla prostych przypadków
  • lastModified jest kluczowy — bez tej właściwości Google nie wie, które strony się zmieniły i crawluje wszystko równo
  • robots.txt przez app/robots.ts — zamiast pliku statycznego użyj wygenerowanego dynamicznie, żeby łatwo blokować boty AI lub środowiska testowe
  • next-sitemap dla złożonych przypadków — generowanie sitemap z dynamicznych ścieżek bazodanowych po buildzie wymaga pluginu; natywne API nie wystarczy
  • Weryfikacja w GSC — po deployu zgłoś sitemapę w Google Search Console i monitoruj raport błędów indeksacji

Sitemap to plik z listą ważnych URL-i, który pomaga wyszukiwarkom szybciej odkrywać i aktualizować podstrony..xml informuje wyszukiwarki o wszystkich stronach w serwisie — ich lokalizacji, dacie ostatniej modyfikacji i opcjonalnych wskazówkach, a plik Robots.txt to plik z dyrektywami dla crawlerów, który wskazuje, które ścieżki mogą lub nie powinny być odwiedzane. kontroluje, które ścieżki crawlery mogą swobodnie odwiedzać. Oba generujesz natywnym API, czyli Application Programming Interface, definiuje sposób komunikacji między aplikacjami lub modułami. Tu chodzi o konwencje plików Next.js, które zamieniają eksportowaną funkcję w gotowy plik sitemap.xml lub robots.txt. konwencji plików Next.js. Choć żaden z nich nie gwarantuje indeksacji ani jej blokady, są fundamentem technicznego SEO, czyli Search Engine Optimization, to optymalizacja strony pod widoczność w wynikach wyszukiwania..

Notatka

Sitemap pomaga robotom szybciej odkrywać ważne URL-e, ale nie zastępuje linkowania wewnętrznego. Jeśli strona nie jest podlinkowana z serwisu, sama obecność w sitemapie zwykle nie wystarczy do mocnej indeksacji.

Natywna sitemap w App Router

Statyczna sitemap

Najprostszym sposobem jest eksport tablicy obiektów z pliku sitemap.ts:

Code
// app/sitemap.ts
import type { MetadataRoute } from 'next'
 
export default function sitemap(): MetadataRoute.Sitemap {
  return [
    {
      url: 'https://strivelab.pl',
      lastModified: new Date('2025-01-15'),
      changeFrequency: 'monthly',
      priority: 1,
    },
    {
      url: 'https://strivelab.pl/uslugi',
      lastModified: new Date('2025-01-15'),
      changeFrequency: 'monthly',
      priority: 0.9,
    },
    {
      url: 'https://strivelab.pl/blog',
      lastModified: new Date('2025-03-01'),
      changeFrequency: 'weekly',
      priority: 0.8,
    },
    {
      url: 'https://strivelab.pl/kontakt',
      lastModified: new Date('2025-01-15'),
      changeFrequency: 'yearly',
      priority: 0.5,
    },
  ]
}

Next.js generuje /sitemap.xml automatycznie.

Pułapka: lastModified: new Date() dla stron statycznych. Użycie new Date() (aktualny czas buildu) dla stron, które rzadko się zmieniają, spowoduje, że przy każdym deployu Google zobaczy nową datę modyfikacji. Może to zmylić crawlera i zmarnować Crawl budget to liczba i częstotliwość adresów URL, które robot wyszukiwarki jest skłonny odwiedzić w Twoim serwisie.. Dla stron statycznych używaj konkretnej daty lub pomijaj pole lastModified całkowicie. Dla treści z bazy danych pobieraj faktyczne pole updatedAt z rekordu.

changeFrequency i priority Google oficjalnie deklaruje, że oba pola traktuje tylko jako wskazówki i w praktyce je ignoruje. Z kolei inne wyszukiwarki (Bing, Yandex) mogą je uwzględniać, więc warto je wypełniać, ale nie skupiaj się na ich optymalizacji, kosztem innych działań SEO.

Dynamiczna sitemap — wpisy z CMS/bazy

Code
// app/sitemap.ts
import type { MetadataRoute } from 'next'
import { db } from '@/lib/db'
 
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const baseUrl = 'https://strivelab.pl'
 
  // Statyczne strony — konkretna data, nie new Date()
  const staticPages: MetadataRoute.Sitemap = [
    {
      url: baseUrl,
      lastModified: new Date('2025-01-15'),
      changeFrequency: 'monthly',
      priority: 1,
    },
    {
      url: `${baseUrl}/uslugi`,
      lastModified: new Date('2025-01-15'),
      changeFrequency: 'monthly',
      priority: 0.9,
    },
    {
      url: `${baseUrl}/kontakt`,
      lastModified: new Date('2025-01-15'),
      changeFrequency: 'yearly',
      priority: 0.5,
    },
  ]
 
  // Dynamiczne strony — posty blogowe
  const posts = await db.post.findMany({
    where: { published: true },
    select: { slug: true, updatedAt: true },
    orderBy: { updatedAt: 'desc' },
  })
 
  const blogPages: MetadataRoute.Sitemap = posts.map((post) => ({
    url: `${baseUrl}/blog/${post.slug}`,
    lastModified: post.updatedAt, // faktyczna data z bazy — poprawne
    changeFrequency: 'monthly' as const,
    priority: 0.7,
  }))
 
  return [...staticPages, ...blogPages]
}

Wielojęzyczna sitemap z hreflang

Natywne API obsługuje pole alternates, służy do deklarowania wersji językowych strony, co Google wymaga przy implementacji hreflang:

Code
// app/sitemap.ts
import type { MetadataRoute } from 'next'
 
export default function sitemap(): MetadataRoute.Sitemap {
  const baseUrl = 'https://strivelab.pl'
 
  return [
    {
      url: baseUrl,
      lastModified: new Date('2025-01-15'),
      changeFrequency: 'monthly',
      priority: 1,
      alternates: {
        languages: {
          pl: baseUrl,
          en: `${baseUrl}/en`,
        },
      },
    },
    {
      url: `${baseUrl}/blog/jak-zbudowac-api`,
      lastModified: new Date('2025-02-10'),
      changeFrequency: 'monthly',
      priority: 0.7,
      alternates: {
        languages: {
          pl: `${baseUrl}/blog/jak-zbudowac-api`,
          en: `${baseUrl}/en/blog/how-to-build-an-api`,
        },
      },
    },
  ]
}

Google wymaga, żeby każda wersja językowa wskazywała na pozostałe wersje w alternates (symetrycznie), jednostronne deklaracje hreflang są ignorowane.

Wiele sitemaps — dla dużych serwisów

Sitemap ma limit 50 000 URL-ów lub 50 MB (nieskompresowany), dla dużych serwisów — generuj wiele sitemaps z indeksem:

Code
// app/sitemap.ts
import type { MetadataRoute } from 'next'
import { db } from '@/lib/db'
 
export async function generateSitemaps() {
  const totalPosts = await db.post.count({ where: { published: true } })
  const sitemapsNeeded = Math.ceil(totalPosts / 50000)
 
  return Array.from({ length: sitemapsNeeded }, (_, i) => ({ id: i }))
}
 
export default async function sitemap({
  id,
}: {
  id: number
}): Promise<MetadataRoute.Sitemap> {
  const baseUrl = 'https://strivelab.pl'
  const limit = 50000
  const offset = id * limit
 
  const posts = await db.post.findMany({
    where: { published: true },
    select: { slug: true, updatedAt: true },
    skip: offset,
    take: limit,
  })
 
  return posts.map((post) => ({
    url: `${baseUrl}/blog/${post.slug}`,
    lastModified: post.updatedAt,
  }))
}

Next.js automatycznie generuje indeks sitemaps: /sitemap.xml → zawiera linki do /sitemap/0.xml, /sitemap/1.xml itd.

Natywny robots.txt

Code
// app/robots.ts
import type { MetadataRoute } from 'next'
 
export default function robots(): MetadataRoute.Robots {
  const baseUrl = 'https://strivelab.pl'
 
  return {
    rules: [
      {
        userAgent: '*',
        allow: '/',
        disallow: ['/api/', '/admin/', '/dashboard/'],
      },
      {
        userAgent: 'GPTBot',
        disallow: '/', // Prośba o brak crawlowania dla bota respektującego robots.txt
      },
    ],
    sitemap: `${baseUrl}/sitemap.xml`,
  }
}

Wynikowy /robots.txt:

Code
User-agent: *
Allow: /
Disallow: /api/
Disallow: /admin/
Disallow: /dashboard/

User-agent: GPTBot
Disallow: /

Sitemap: https://strivelab.pl/sitemap.xml

next-sitemap — kiedy natywne API nie wystarczy

Biblioteka next-sitemap oferuje dodatkowe funkcje, czyli automatyczne wykrywanie statycznie wygenerowanych stron po buildzie, wielojęzyczne sitemaps z hreflang, server-side sitemap regeneration i konfigurację per-ścieżka.

Code
npm install next-sitemap
Code
// next-sitemap.config.js
module.exports = {
  siteUrl: 'https://strivelab.pl',
  generateRobotsTxt: true,
  changefreq: 'weekly',
  priority: 0.7,
  sitemapSize: 5000,
  exclude: ['/api/*', '/admin/*', '/dashboard/*'],
  robotsTxtOptions: {
    additionalSitemaps: ['https://strivelab.pl/server-sitemap.xml'],
    policies: [
      { userAgent: '*', allow: '/' },
      { userAgent: 'GPTBot', disallow: '/' },
    ],
  },
  transform: async (config, path) => {
    // Custom priorytety per ścieżka
    if (path === '/') return { loc: path, priority: 1.0, changefreq: 'daily' }
    if (path.startsWith('/blog/'))
      return { loc: path, priority: 0.7, changefreq: 'monthly' }
    return {
      loc: path,
      priority: config.priority,
      changefreq: config.changefreq,
    }
  },
}
Code
// package.json
{
  "scripts": {
    "postbuild": "next-sitemap"
  }
}

Natywne API vs next-sitemap — co wybrać?

FunkcjaNatywne APInext-sitemap
Automatyczne wykrywanie stronNieTak (po buildzie)
Dynamiczne strony z DBTak (ręczne)Tak (server sitemap)
Hreflang / alternatesTak (pole alternates)Tak (automatyczne)
Wielki serwis (> 50K stron)Tak (generateSitemaps)Tak (sitemapSize)
Konfiguracja per-ścieżkaRęczna (w kodzie)transform function
Dodatkowe zależnościZero1 pakiet
Koszt utrzymaniaMinimalny (część frameworka)Wyższy (zależność do aktualizacji)

Dla większości projektów, zwłaszcza tych z przewidywalną strukturą, natywne API Next.js jest w zupełności wystarczające, prostsze i nie wprowadza dodatkowych zależności. Sięgnij po next-sitemap tylko w wyjątkowych sytuacjach, gdy masz bardzo duży, nietypowy serwis, gdzie automatyczne wykrywanie stron i zaawansowane transformacje oszczędzą Ci mnóstwa pracy manualnej.

Weryfikacja w Google Search Console

Po wdrożeniu sitemap i robots.txt:

  1. Otwórz Google Search Console → Sitemaps
  2. Dodaj URL sitemap: https://strivelab.pl/sitemap.xml
  3. Sprawdź status — Google pokaże liczbę wykrytych i zaindeksowanych stron
  4. Monitoruj zakładkę „Strony" — szukaj błędów indeksowania

Werdykt Labu

Dzięki natywnemu API w Next.js App Router, automatyczne generowanie plików sitemap.xml i robots.txt sprowadza się do kilku linii kodu w TypeScript. Wbudowane narzędzia (sitemap.ts, robots.ts) pokrywają 90% typowych scenariuszy bez potrzeby instalowania zewnętrznych bibliotek. Nawet przy ogromnych serwisach z dynamiczną treścią, funkcja generateSitemaps elegancko radzi sobie z automatycznym podziałem mapy na mniejsze pliki.

Cała filozofia sprowadza się do kilku dobrych praktyk. Pamiętaj, aby zawsze używać faktycznej daty modyfikacji w lastModified, poza tym unikaj używania new Date() dla stron statycznych, co zapobiega marnowaniu budżetu na ponowne crawlowanie niezmienionych treści. W robots.txt zablokuj ścieżki, które nie powinny być publiczne (np. /admin, /api), a po wdrożeniu koniecznie sprawdź status sitemapy w Google Search Console.

Jeśli chcesz mieć pewność, że techniczny fundament SEO Twojej strony w Next.js — sitemap, robots.txt, indeksacja — jest poukładany poprawnie, przeprowadzę audyt i wdrożę poprawki albo zobacz, jak realizuję projekty w Next.js.

  • Dlaczego sitemap i robots.txt są ważne?1 min
  • Natywna sitemap w App Router1 min
  • Natywny robots.txt1 min
  • next-sitemap — kiedy natywne API nie wystarczy1 min
  • Weryfikacja w Google Search Console1 min
  • Werdykt Labu1 min

Często zadawane pytania

ŹródłaZweryfikowano: 31 maja 2026

Dokumentacja Next.js i Google dotycząca sitemap oraz robots.txt zweryfikowana podczas redakcji artykułu.

  • Next.js — sitemap.xml
  • Next.js — robots.txt
  • Google — Build and submit a sitemap
  • Google — robots.txt introduction

Seria

Next.js i SEO techniczne
Część 2 / 5
  1. 1Next.js a SEO — kiedy naprawdę daje przewagę nad zwykłym Reactem
  2. Next.js Sitemap i robots.txt — automatyczna generacja z App Routera
  3. 3Hreflang i canonical w Next.js — SEO wielojęzycznych stron bez duplikacji
  4. 4Google Search Console + Next.js — indeksacja, błędy, performance i co z nimi robić
  5. 5Migracja z WordPress do Next.js — redirecty 301 i pozycje SEO
Maciej Sala

O autorze

Maciej Sala

Maciej Sala — project manager i frontendowiec z doświadczeniem w marketingu internetowym. Na co dzień pracuję z Reactem, Next.js i TypeScriptem, łącząc perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat związany z branżą gier wideo jako project manager i game designer.

Absolwent historii na Uniwersytecie Jagiellońskim i studiów podyplomowych z marketingu internetowego na Akademii Górniczo-Hutniczej w Krakowie. Poza pracą trenuje na siłowni, maluje figurki i realizuje własne projekty.

Moje artykułyWięcej o mnie

Pomagam przekładać takie tematy na konkretne wdrożenia w frontendzie, SEO, analityce i procesie produktowym.

Skontaktuj się ze mną

Biblioteka wiedzy

Czytaj dalej

Zobacz więcej wpisów
Google Search Console + Next.js — indeksacja, błędy, performance i co z nimi robić
Google Search Console + Next.js — indeksacja, błędy, performance i co z nimi robić

Jak korzystać z Google Search Console dla strony Next.js? Weryfikacja, sitemap, indeksacja, Core Web Vitals, crawl budget i najczęstsze problemy — praktyczny poradnik.

Maciej Sala

Maciej Sala

Founder Strivelab

11 kwietnia 2026
Hreflang i canonical w Next.js — SEO wielojęzycznych stron bez duplikacji
Hreflang i canonical w Next.js — SEO wielojęzycznych stron bez duplikacji

Jak poprawnie ustawić hreflang i canonical w Next.js App Router? Unikanie duplikacji treści, konfiguracja metadata API, wielojęzyczna sitemap i typowe błędy SEO.

Maciej Sala

Maciej Sala

Founder Strivelab

10 kwietnia 2026
Next.js a SEO — kiedy naprawdę daje przewagę nad zwykłym Reactem
Next.js a SEO — kiedy naprawdę daje przewagę nad zwykłym Reactem

Jak Next.js wpływa na SEO w praktyce? SSR, SSG, metadata, Core Web Vitals i techniczne ograniczenia, o których warto wiedzieć przed wyborem frameworka.

Maciej Sala

Maciej Sala

Founder Strivelab

15 lipca 2025
Poprzedni wpisSupabase + Next.js — uwierzytelnianie, baza, storage i realtime w jednym stackuAktualny poradnik Supabase + Next.js App Router: @supabase/ssr, publishable keys, Middleware, Server Actions, RLS, Storage i Realtime bez przestarzałych Auth Helpers.
Maciej Sala

Maciej Sala

Founder Strivelab

10 kwietnia 2026
Następny wpisPagespeed 100/100 w Next.js — case study optymalizacji strony usługowejJak osiągnąć wynik 100/100 w PageSpeed Insights dla strony Next.js? Case study optymalizacji LCP, INP i CLS — fonty, obrazy, JavaScript, third-party scripts i Server Components.
Maciej Sala

Maciej Sala

Founder Strivelab

10 kwietnia 2026