Con App Router elegimos entre app/robots.txt estático y app/robots.ts/app/robots.js generado. Usamos la opción menos dinámica que cubra el requisito.
Archivo estático
User-agent: *
Allow: /
Sitemap: https://example.com/sitemap.xml
Es fácil de revisar y tiene pocas dependencias.
Ruta generada
import type { MetadataRoute } from 'next'
export default function robots(): MetadataRoute.Robots {
return { rules: { userAgent: '*', allow: '/' }, sitemap: 'https://example.com/sitemap.xml' }
}
Revisamos cache y comportamiento dynamic
Una ruta generada puede estar cacheada según su implementación. Confirmamos la documentación actual y la respuesta desplegada antes de asumir que un cambio de código ya está público.
Protegemos previews fuera de robots.txt
Staging privado necesita autenticación. También comprobamos que variables de entorno no generen un Sitemap: con dominio de preview.
Verificamos el deploy
Abrimos /robots.txt, usamos el validator y probamos URLs con el tester. Si el resultado difiere, revisamos routing, cache, environment variables y ownership del despliegue.