Erscheinungsbild
Indexierung
Ob eine Seite in den Index gehört, hängt an zwei unabhängigen Fragen. Der Starter beantwortet sie getrennt (ADR 0006):
| Frage | Antwort in |
|---|---|
| Gehört diese Seite in den Index? | NICHT_INDEXIERBARE_ROUTEN (Routen-Policy) |
| Darf diese Ausgabe indexiert werden? | PUBLIC_ENVIRONMENT |
Die Routen-Policy
ts
// src/lib/seo/indexing.ts
export const NICHT_INDEXIERBARE_ROUTEN = ['/404', '/styleguide'] as const;Diese Liste ist die einzige Quelle. Sie steuert zugleich das robots-Meta, robots.txt und die Auswahl der Seiten in der Sitemap. Eine Seite kann dadurch nicht in der Sitemap stehen und gleichzeitig noindex tragen — ein Widerspruch, den Suchmaschinen melden.
Eine neue Seite, die nicht in den Index gehört, kommt in diese Liste. Das Prop noindex an BaseLayout bleibt für Einzelfälle — etwa eine Danke-Seite nach dem Formular, die es nur nach einem Absenden gibt.
Unterseiten einer ausgeschlossenen Route sind ebenfalls ausgeschlossen: /styleguide/formulare bleibt draußen, /styleguide-fuer-kunden nicht.
Die Umgebung
Ohne PUBLIC_ENVIRONMENT=production ist die Website gesperrt
Indexierbar ist ausschließlich die Produktionsausgabe. Der Vorgabewert der Variablen ist development — ein Deployment, bei dem sie vergessen wurde, liefert überall noindex, nofollow und ein Disallow: / aus.
Das ist die sichere Richtung: Ein versehentlich indexierter Preview-Stand konkurriert dauerhaft mit der echten Website und lässt sich nur langsam wieder aus dem Index entfernen. Eine vergessene Variable beim Livegang fällt dagegen innerhalb von Tagen auf.
| Umgebung | robots-Meta | robots.txt |
|---|---|---|
production | index, follow¹ | Allow: / |
preview | noindex, nofollow | Disallow: / |
development | noindex, nofollow | Disallow: / |
¹ sofern die Route in den Index darf.
robots.txt
Ein Endpunkt (src/pages/robots.txt.ts), keine Datei unter public/: Sein Inhalt hängt von der Umgebung und von features.sitemap ab. In der Produktion:
# https://www.muster.de
User-agent: *
Allow: /
Disallow: /404
Disallow: /styleguide
Sitemap: https://www.muster.de/sitemap.xmlAußerhalb der Produktion steht dort ein vollständiges Disallow: / ohne Sitemap-Verweis — er wäre eine Einladung zu genau dem, was gerade verboten wurde.
Sitemap
Die Sitemap entsteht in einer eigenen Integration nach dem Bauen und enthält jede indexierbare Seite genau einmal, sortiert und in derselben Schreibweise wie der jeweilige Canonical.
xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://www.muster.de/</loc>
</url>
</urlset>Steht features.sitemap auf false, entsteht keine Datei — statt einer, die dann leer oder veraltet im Wurzelverzeichnis läge.
Die Sitemap ist in jeder Umgebung dieselbe. Sie beschreibt den Aufbau der Website; verboten wird das Indexieren über robots.txt und das Meta-Tag.
Kein lastmod. Ein Datum, das bei jedem Build auf „heute" springt, ist eine Angabe über den Build und nicht über den Inhalt. Sobald es mit den Inhalten eine echte Quelle für Änderungsdaten gibt, gehört es hinein.
Wie das geprüft wird
Beide Umgebungszustände stehen im Post-Build-Test, weil sie sich nur auf dem fertigen HTML belegen lassen:
| Ausgabe | Umgebung | Feature-Flags |
|---|---|---|
dist | development | wie project.config |
dist-fixture-minimal | development | alle aus |
dist-fixture-full | production | alle an |
Die Fixture „full" wird deshalb mit PUBLIC_ENVIRONMENT=production gebaut. Damit die Umgebungsprüfung dort nicht abbricht, trägt sie eine site.url ohne Platzhalter-Host.