De App Router genereert beide uit getypeerde code. Dat is het einde van verouderde statische XML:
// app/sitemap.ts
import type { MetadataRoute } from "next";
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const posts = await getPosts();
const postEntries = posts.map((post) => ({
url: `https://example.com/en/blog/${post.slug}`,
lastModified: post.updatedAt,
alternates: {
languages: {
pl: `https://example.com/pl/blog/${post.plSlug}`,
ru: `https://example.com/ru/blog/${post.ruSlug}`,
},
},
}));
return [{ url: "https://example.com", priority: 1 }, ...postEntries];
}
// app/robots.ts
import type { MetadataRoute } from "next";
export default function robots(): MetadataRoute.Robots {
return {
rules: [{ userAgent: "*", allow: "/", disallow: ["/api/", "/admin/"] }],
sitemap: "https://example.com/sitemap.xml",
};
}
Details die ertoe doen:
lastModifiedmoet de echte datum van de contentwijziging zijn, nietnew Date()bij elke build. Liegen over versheid leert Google dit veld te negeren.- Meer dan 50.000 URL's? Gebruik
generateSitemaps()om op te splitsen in meerdere bestanden. - Blokkeer geen CSS/JS in robots.txt: Google heeft ze nodig om de pagina te renderen.
- Een disallow in
robots.txthaalt pagina's niet uit de index, het stopt alleen het crawlen. Wil je dat een pagina niet in de resultaten verschijnt, gebruik dannoindexvia metadata (robots: { index: false }) en blokkeer haar niet in robots.txt (een geblokkeerde pagina kan niet worden gelezen, dus niemand ziet de noindex).
Checklist:
-
sitemap.tsbevat alleen canonieke, indexeerbare adressen met status 200 -
lastModifiedweerspiegelt echte wijzigingen - Sitemap aangemeld in Google Search Console en Bing Webmaster Tools
- noindex en robots.txt juist gebruikt (ze lossen verschillende problemen op)
