fix: Warenkorb, Kasse, Konto und Rechnungen fielen nicht aus dem Suchindex

robots.txt sperrte /checkout, /warenkorb, /konto und /rechnung fuer Crawler.
Das verbietet aber nur das Abrufen, nicht das Indexieren: verweist irgendwo
ein Link auf eine dieser Seiten, nimmt Google die URL trotzdem auf — als
inhaltslosen Treffer mit dem Hinweis "Fuer diese Seite sind keine
Informationen verfuegbar".

Der uebliche Ausweg, ein noindex-Meta-Tag, half hier nicht: eine per
robots.txt gesperrte Seite wird nie geladen, also sieht der Crawler das Tag
nie. Die Sperre verhinderte ausgerechnet das Mittel, das die URLs wieder aus
dem Index geholt haette. Keine dieser Seiten trug bisher ueberhaupt ein
noindex.

Jetzt greifen beide Mechanismen zusammen statt gegeneinander:

- lib/seo.ts buendelt die beiden robots-Bausteine. noIndex laesst Links
  weiterhin folgen (Footer- und Produktlinks im Warenkorb sollen ihre
  Linkkraft behalten), noIndexPrivate unterbindet zusaetzlich Cache-Kopie,
  Bildindexierung und Textausschnitt.
- Kasse, Bestellbestaetigung und Rechnungsansicht bekommen noIndexPrivate,
  der Warenkorb noIndex.
- Der gesamte Kontobereich bekommt das Tag einmal ueber ein neues
  konto/layout.tsx statt in zehn Unterseiten einzeln. Metadata erbt
  feldweise, ein eigener title in einer Unterseite loescht den Wert also
  nicht.
- robots.txt sperrt nur noch /api/ und /admin — also das, was ein Crawler
  wirklich nie abrufen soll. Alles andere darf gecrawlt werden, damit das
  noindex ueberhaupt gelesen wird. /uploads bleibt bewusst offen: dort liegen
  die Produktbilder, die in der Bildersuche erwuenscht sind.

Zusaetzlich eine ausdrueckliche Regel fuer GPTBot, ClaudeBot, PerplexityBot
und Google-Extended (oeffentliche Inhalte ja, interne Bereiche nein) sowie
die host-Angabe in robots.txt.

tsc: 0 Fehler. vitest: 359/359 gruen. eslint: 0 Warnungen.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5 committed 2026-09-20 03:05:54 +02:00
1 parent bffcce127d
commit a8990a872a
7 files changed
+105 -5

No files matched your search

+39
View File
@@ -0,0 +1,39 @@
import type { Metadata } from "next";
/**
* Metadata-Bausteine fuer Seiten, die NICHT in den Suchindex gehoeren.
*
* Warum reicht der Eintrag in robots.ts nicht?
* "Disallow" verbietet nur das CRAWLEN, nicht das INDEXIEREN. Verweist
* irgendwo ein Link auf /warenkorb oder /konto/bestellungen, nimmt Google die
* URL trotzdem in den Index auf — nur eben ohne Inhalt, als Treffer mit dem
* Hinweis "Fuer diese Seite sind keine Informationen verfuegbar". Schlimmer:
* weil der Crawler die Seite nicht lesen darf, sieht er ein dort gesetztes
* noindex NIE. Deshalb muessen beide Mechanismen zusammenspielen — robots.ts
* haelt den Crawler von den nutzlosen Seiten fern, dieses Meta-Tag sorgt
* dafuer, dass eine trotzdem entdeckte URL wieder aus dem Index faellt.
*
* follow: true statt false ist Absicht. Links auf diesen Seiten (Footer,
* Navigation, Produktlinks im Warenkorb) sollen ihre Linkkraft weiterhin an
* die oeffentlichen Seiten weitergeben; nur die Seite selbst soll nicht als
* Suchtreffer erscheinen.
*/
export const noIndex: Metadata["robots"] = {
index: false,
follow: true,
googleBot: { index: false, follow: true },
};
/**
* Wie noIndex, zusaetzlich ohne Cache-Kopie und ohne Textausschnitt in den
* Suchergebnissen. Fuer Seiten mit personenbezogenen Daten (Rechnungen,
* Bestellungen, Kontodaten): selbst wenn eine URL versehentlich oeffentlich
* erreichbar waere, soll kein Inhalt in einem Suchmaschinen-Snippet oder
* -Cache landen.
*/
export const noIndexPrivate: Metadata["robots"] = {
index: false,
follow: false,
nocache: true,
googleBot: { index: false, follow: false, noimageindex: true, "max-snippet": 0 },
};