User-agent: * Allow: / # Die echten URLs tragen alle ein /{lang}/{country}-Präfix (app/router.options.ts), die # unpräfixierten Formen sind nur die Weiterleitungen davor. Bis #216 standen hier ausschließlich # die unpräfixierten Pfade — sie trafen damit keine einzige reale Seite. Beide Formen bleiben # stehen: die Root-Pfade, solange Google sie noch kennt, die präfixierten, weil sie die Regel # überhaupt erst wirksam machen. # # `/orders` behält den Slash: darunter liegt nur `[orderId]`, eine Übersichtsseite existiert nicht. # # DIE KONTO-STRECKE STEHT SEIT #277 NICHT MEHR HIER, und das ist Absicht. Eine robots.txt regelt # das CRAWLEN, nicht das Indexieren. `/de/de/account/login` und `/de/de/account/register` waren # gesperrt und trotzdem im Index („Indexiert, obwohl durch robots.txt blockiert") — die Sperre war # ab da genau der Grund, aus dem sie dort BLIEBEN: Google holt eine gesperrte URL nie wieder ab und # sieht deshalb nie einen noindex. Herausgenommen werden sie jetzt über # `X-Robots-Tag: noindex, nofollow` aus den `routeRules` in `nuxt.config.ts`, und den sieht Google # nur, wenn es die Seite abrufen darf. Dasselbe Argument, mit dem `deploy/Caddyfile` im Snippet # `noindex_crawlable` auf den Testumgebungen `Allow: /` schreibt. # # AUSSTIEG: sobald die Search Console für die Konto-URLs null indexierte Seiten meldet, dürfen # `Disallow: /account` und `Disallow: /*/*/account` zurück. Vorher nicht — und dann muss der Header # weg, sonst ist er wieder unsichtbar. Die Wache in `utils/__tests__/sitemapRoutes.test.ts` # („kein Pfad ist gleichzeitig gesperrt und auf noindex gesetzt") schlägt fehl, wenn nur die eine # Hälfte zurückkommt. # # WARUM DIE TOKEN-ROUTEN BLEIBEN: `magic/`, `impersonate`, `reset-password`, `verify-email` und # `account/confirm-email-change` tragen ihren Einmal-Parameter in der URL — ein Crawler, der einen # Magic Link abruft, VERBRAUCHT ihn. Sie sind nirgends verlinkt, es gibt dort also auch nichts zu # deindexieren, und der Absatz darüber trifft auf sie nicht zu: was nicht im Index steht, kann eine # Sperre dort auch nicht festhalten. # # `account/confirm-email-change` ist dabei die Ausnahme in der Ausnahme und steht deshalb EINZELN # statt über das weggefallene `/*/*/account`: die Seite ruft in `onMounted` `confirmEmailChange()` # und meldet danach ab — ein abgerufener Link ist ein verbrauchter Link. Die vier Geschwister # darüber liegen zufällig auf der obersten Ebene und haben ihre Zeile deshalb nie verloren; diese # hier hing an der Konto-Sperre und wäre mit ihr still mitgegangen. Die Wache # („kein Pfad ist gleichzeitig gesperrt und auf noindex gesetzt") prüft ein BEISPIEL je # noindex-Muster (`/de/de/account/a/b`) und lässt eine so eng gezogene Zeile durch — was hier # richtig ist, aber nichts beweist: wer die Zeile verbreitert, sperrt wieder die Konto-Strecke. # # UND WARUM DIE DEMO-SEITEN HIER FEHLEN: `/demo-dispo`, `/demo-dienstleister` und # `/services/coming-soon` sind heute im Index (#277). Ein `Disallow` zementierte sie dort, statt sie # herauszunehmen — sie tragen deshalb ebenfalls nur den noindex-Header und stehen in # `SITEMAP_EXCLUDED_PAGES`. Disallow: /cart Disallow: /checkout Disallow: /orders/ Disallow: /*/*/cart Disallow: /*/*/checkout Disallow: /*/*/orders/ Disallow: /*/*/magic/ Disallow: /*/*/impersonate Disallow: /*/*/reset-password Disallow: /*/*/verify-email Disallow: /*/*/account/confirm-email-change Disallow: /*/*/vergleich Disallow: /*/*/merkliste # AUSDRÜCKLICH CRAWLBAR (#222): die beiden Dateien für KI-Agenten. `Allow: /` oben deckt sie schon # ab, protokollarisch sind diese Zeilen also wirkungslos — sie stehen als ABSICHTSERKLÄRUNG hier, # damit die nächste `Disallow`-Zeile nicht versehentlich darüber läuft. Sie sind keine statischen # Dateien, sondern entstehen zur Laufzeit in `server/routes/`; der Text liegt in # `utils/agentDocs.ts`, die Sitemap-Einträge in `SITEMAP_ROOT_FILES`. Allow: /llms.txt Allow: /agents.md # Diese Datei bedient NUR die Produktion. Sie wird byte-gleich in jede Umgebung gebaut, und genau # das war #220: staging und qa1 lieferten sie mit aus, also `Allow: /` plus einen Verweis auf die # PRODUKTIONS-Sitemap — Googlebot wurde von der Testumgebung zusätzlich auf die Prod-URLs geschickt. # Behoben wird das am Proxy, nicht hier: `deploy/Caddyfile` beantwortet /robots.txt auf jedem # Nicht-Prod-Host selbst (Snippet `noindex_crawlable`). Diese Datei bleibt deshalb unverändert # richtig — bitte nicht „für staging entschärfen", das nähme der Produktion ihre Sitemap-Zeile. # # Einstiegspunkt ist der INDEX, nicht /sitemap.xml: bei mehreren Teil-Sitemaps leitet # @nuxtjs/sitemap /sitemap.xml selbst hierher weiter (#216). Sitemap: https://roadpartner.de/sitemap_index.xml