Careeroza
Sitemap and Robots
app/sitemap.ts
A sitemap lists your URLs for search engines. Generate it from the database so new products appear automatically:
import type { MetadataRoute } from 'next';
import { prisma } from '@/lib/prisma';
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const products = await prisma.product.findMany({ select: { id: true, updatedAt: true } });
return [
{ url: 'https://shopease.in', changeFrequency: 'daily', priority: 1 },
{ url: 'https://shopease.in/products', changeFrequency: 'hourly', priority: 0.9 },
...products.map((p) => ({
url: 'https://shopease.in/products/' + p.id,
lastModified: p.updatedAt,
changeFrequency: 'weekly' as const,
priority: 0.7,
})),
];
}What It Produces
Example
The XML that /sitemap.xml returns, built by hand:
type Entry = { url: string; lastModified?: string; priority?: number };
function toXml(entries: Entry[]): string {
const rows = entries.map((e) =>
' <url><loc>' + e.url + '</loc>' +
(e.lastModified ? '<lastmod>' + e.lastModified + '</lastmod>' : '') +
(e.priority !== undefined ? '<priority>' + e.priority + '</priority>' : '') + '</url>');
return ['<?xml version="1.0" encoding="UTF-8"?>',
'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">', ...rows, '</urlset>'].join('\n');
}
const products = [{ id: 1, updated: '2026-01-15T10:00:00Z' }, { id: 2, updated: '2026-02-01T08:30:00Z' }];
console.log(toXml([
{ url: 'https://shopease.in', priority: 1 },
...products.map((p) => ({ url: 'https://shopease.in/products/' + p.id, lastModified: p.updated, priority: 0.7 })),
]));Output
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://shopease.in</loc><priority>1</priority></url> <url><loc>https://shopease.in/products/1</loc><lastmod>2026-01-15T10:00:00Z</lastmod><priority>0.7</priority></url> <url><loc>https://shopease.in/products/2</loc><lastmod>2026-02-01T08:30:00Z</lastmod><priority>0.7</priority></url> </urlset>
app/robots.ts
import type { MetadataRoute } from 'next';
export default function robots(): MetadataRoute.Robots {
return {
rules: { userAgent: '*', allow: '/', disallow: ['/admin/', '/account/', '/api/', '/cart'] },
sitemap: 'https://shopease.in/sitemap.xml',
};
}Example
curl localhost:3000/robots.txtExample output
User-Agent: * Allow: / Disallow: /admin/ Disallow: /account/ Disallow: /api/ Disallow: /cart Sitemap: https://shopease.in/sitemap.xml