Skip to content

Indexierung

Ob eine Seite in den Index gehört, hängt an zwei unabhängigen Fragen. Der Starter beantwortet sie getrennt (ADR 0006):

FrageAntwort 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.

Umgebungrobots-Metarobots.txt
productionindex, follow¹Allow: /
previewnoindex, nofollowDisallow: /
developmentnoindex, nofollowDisallow: /

¹ 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.xml

Auß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:

AusgabeUmgebungFeature-Flags
distdevelopmentwie project.config
dist-fixture-minimaldevelopmentalle aus
dist-fixture-fullproductionalle 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.