Di App Router, kami memilih antara app/robots.txt statis dan app/robots.ts atau app/robots.js yang generated.
Kami memilih statis bila cukup
Kebijakan sederhana mengurangi runtime dependency dan lebih mudah diaudit.
Untuk generasi kami memakai MetadataRoute.Robots
import type { MetadataRoute } from 'next'
export default function robots(): MetadataRoute.Robots {
return { rules: { userAgent: '*', allow: '/' }, sitemap: 'https://example.com/sitemap.xml' }
}
Kami mengecek cache dan dynamic behavior
Generated metadata route dapat memiliki cache sesuai implementasinya. Kami membandingkan source dengan response deployment.
Preview privat memakai access control
Kami memakai autentikasi dan mencegah Sitemap: mengarah ke preview host.
Kami memverifikasi deployment
Kami membuka /robots.txt, memakai validator dan menguji URL dengan tester.
Perilaku App Router saat ini
Next.js mendukung app/robots.txt statis serta app/robots.ts / app/robots.js yang menghasilkan MetadataRoute.Robots. Route metadata yang dihasilkan dapat di-cache tergantung implementasinya, sehingga kami memeriksa versi framework dan response publik, bukan menganggap setiap request menghitung ulang file.
Untuk policy stabil kami memilih statis. Generasi dipakai hanya bila memberi nilai nyata, misalnya beberapa crawler group atau hostname yang dikendalikan environment. Kami menghindari dependency API eksternal di route robots.
Kegagalan yang diuji saat deploy
Kami mengecek sitemap berisi preview host, middleware/proxy menangkap /robots.txt, konflik file statis dengan route generated, cache lama, dan branch staging aktif di production. Smoke test memeriksa status, content-type, body, dan hostname sitemap pada domain publik.
Hostname production dibuat eksplisit
Jika sitemap atau canonical bergantung pada environment variable, kami memakai nilai production yang jelas, bukan membentuk host dari request yang kebetulan datang. /robots.txt masuk ke smoke test deployment: status, content-type, body, dan hostname sitemap diperiksa. Konfigurasi penting yang hilang sebaiknya gagal lebih awal daripada diam-diam mempublikasikan domain preview.