import type { MetadataRoute } from "next"; import { getSiteUrl } from "@/lib/url"; // Muss zur Laufzeit statt zur Build-Zeit gerendert werden (gleicher Grund wie // bei sitemap.ts): sonst backt Next.js die Datei beim Build als statische // Antwort ein — samt dem Wert, den NEXT_PUBLIC_SITE_URL GERADE DA hatte. Im // Docker-Build ist die Variable nicht gesetzt (siehe Dockerfile), die Sitemap- // Zeile fror damit dauerhaft auf dem Rueckfallwert aus site-config.ts ein, // egal unter welcher Domain die Seite spaeter tatsaechlich lief. export const dynamic = "force-dynamic"; // Nur Pfade, die ein Crawler ueberhaupt nicht ABRUFEN soll. Das ist eine // bewusst kurze Liste, denn "Disallow" und "noindex" schliessen einander aus: // eine per robots.txt gesperrte Seite wird nie geladen, also sieht Google das // dort gesetzte noindex nie — und nimmt die URL bei einem eingehenden Link // trotzdem als inhaltslosen Treffer in den Index auf. // // Deshalb stehen /checkout, /warenkorb, /konto und /rechnung hier NICHT mehr // (frueher taten sie es). Sie tragen stattdessen ein noindex-Meta-Tag (siehe // lib/seo.ts) und duerfen dafuer gecrawlt werden — nur so faellt eine bereits // indexierte URL wieder aus dem Index. Der zusaetzliche Crawl-Aufwand ist bei // einer Handvoll Seiten vernachlaessigbar. // // Was bleibt: // - /api: Maschinenschnittstellen ohne jeden Nutzen in Suchergebnissen. // - /admin: liefert einem anonymen Crawler ohnehin nur eine Weiterleitung auf // die Anmeldung; jeder Abruf ist reine Last. // - /uploads ist bewusst NICHT gesperrt — dort liegen die Produktbilder, die // in der Google-Bildersuche durchaus erwuenscht sind. const disallow = ["/api/", "/admin"]; export default function robots(): MetadataRoute.Robots { return { rules: [ { userAgent: "*", allow: "/", disallow, }, // GPTBot & Co. duerfen die oeffentlichen Inhalte lesen (Sichtbarkeit in // KI-Antworten ist erwuenscht), aber ohne die internen Bereiche. // Separat aufgefuehrt, damit eine spaetere Entscheidung dagegen nur // diesen Block betrifft und nicht die Suchmaschinen mit einschliesst. { userAgent: ["GPTBot", "ClaudeBot", "PerplexityBot", "Google-Extended"], allow: "/", disallow, }, ], sitemap: `${getSiteUrl()}/sitemap.xml`, host: getSiteUrl(), }; }