Skip to content
Konsultasi

Memecah Sitemap Next.js jadi File Anak 200 URL

Cara saya memecah sitemap Next.js jadi file anak 200 URL pakai generateSitemaps, melistnya di robots.txt, dan apa yang sebenernya dibaca Google dari sebuah sitemap.

Adityo Guni Waluyo2 menit baca

404 yang ngajarin: Next.js nggak bikin sitemap index

Saya pasang generateSitemaps() di sitemap.ts blog, deploy, lalu buka /sitemap.xml buat submit ke Search Console. 404. File anak ada di /sitemap/0.xml, tapi nggak ada yang nunjuk ke sana, jadi Googlebot nggak punya pintu masuk dan nggak akan pernah nemu artikelnya.

Ini bukan salah saya. Next.js emang nggak mengeluarkan root /sitemap.xml sebagai index kalau kita pakai generateSitemaps() (tercatat di vercel/next.js#77304). Framework kasih URL anak-anaknya; menyambungkannya ke sesuatu yang bisa di-crawl jadi urusan kita.

Perbaikannya: robots.txt yang kita rawat sendiri

Maka robots.ts nge-list tiap file anak secara eksplisit: Sitemap: https://adityo.web.id/sitemap/0.xml, lalu /sitemap/1.xml, dan seterusnya. Search Console baca itu dan nge-crawl satu-satu. Pecahannya sendiri: chunk 200 URL. Rute statis selalu di file 0, artikel published menyusul, diambil dari list API lintas locale. Urutannya wajib deterministik, karena generateSitemaps() menghitung Math.ceil(total / 200) dan sitemap(id) memotong array yang sama. Kalau dua-duanya beda, satu URL diam-diam loncat antar-chunk tiap run dan kelanjutan crawl hilang. Tiap entri artikel bawa alternatif hreflang dari translation_group-nya, dengan x-default dipatok ke en.

Satu sentuhan tangguh: kalau API artikel nggak bisa dihubungi, sitemap turun ke rute statis alih-alih lempar 500. Sitemap rusak lebih parah daripada sitemap sebagian.

Kenapa di-chunk, dan apa yang sebenernya dibaca Google

Google batasi satu sitemap maksimal 50.000 URL atau 50MB. Blog ini kecil sekarang, tapi artikel terus nambah; di-chunk dari sekarang adalah bentuk yang sesuai protokol, bukan panik belakangan. Pelajaran yang lebih berguna soal XML-nya: Google mengabaikan <priority> dan <changefreq> sepenuhnya. Hanya <lastmod> yang mengisi penjadwalan recrawl, dan cuma kalau terbukti akurat. Jadi saya set lastmod dari updated_at artikel, bukan timestamp build. Nge-stempel "sekarang" di tiap entri justru ngajarin Google buat nggak percaya tanggal kita, yang efeknya kebalikan dari membantu. Endpoint ping sitemap udah deprecated sejak Juni 2023, jadi baris Sitemap: di robots.txt atau submit langsung ke Search Console itu satu-satunya jalur yang penting sekarang.

Saya lebih milih rawat daftar robots sendiri daripada nempel route index yang berantem dengan konvensi file Next. Bagian bergerak lebih sedikit, dan mode gagalnya anggun alih-alih 500 keras. Kalau mau versi panjangnya gimana blog ini dirakit, tulisan migrasi ke Vercel dan strategi branch nge-cover sisanya.