Astro-SEO

Astro gehört zu den stärksten Frameworks für SEO — Seiten werden standardmäßig als statisches HTML prerendered und liefern JavaScript nur dort aus, wo Sie es anfordern, mit starken Core Web Vitals. Standards sind aber keine Garantien, und Astro schreibt Meta-Tags, Sitemap oder Canonicals nicht für Sie. Hier erfahren Sie, wie ich meine eigene Astro-Website betreibe und die Architektur richtig einrichte.

Erstveröffentlicht: 26. Juni 2026 · Zuletzt aktualisiert: 8. Aug. 2026 · Fortgeschritten
Sprachen

Astro ist eine der stärksten Framework-Entscheidungen für SEO, weil es standardmäßig statisches HTML prerendered — Ihr Inhalt steht beim ersten Crawling im rohen HTML, ohne Rendering-Warteschlange für diese Route. Islands hydratisieren nur die mit einer client-Direktive markierten Komponenten, sodass der größte Teil der Seite ohne eigene Hydration-JS ausgeliefert wird (Astro kann an anderer Stelle weiterhin Seitenskripte und Router-JS hinzufügen) — nichts davon garantiert für sich Crawlability, Indexierung oder Rankings; prüfen Sie die bereitgestellten Routen. Astro-Seiten erzielen außerdem starke Core-Web-Vitals-Werte. Der Haken: Astro erzeugt sauberes HTML, schreibt aber keine Meta-Tags, Canonicals, Sitemap oder strukturierten Daten — das sind bewusste Build-Schritte, und die Sitemap-Erkennung zielt auf statisch erzeugte Routen, sodass reine Laufzeit-URLs ausdrücklich behandelt werden müssen. Server Islands (für die ein Adapter nötig ist) und View Transitions sind SEO-sicher, wenn Sie verstehen, was Crawler tatsächlich abrufen. Ich betreibe patrickstox.com mit Astro, daher ist dies der Stack, in dem ich tatsächlich arbeite.

TL;DR — Astro ist architektonisch gut für SEO aufgestellt: Seiten und Endpunkte werden standardmäßig als statisches HTML prerendered, sodass Sie für diesen Inhalt nicht auf eine Rendering-Welle warten müssen — das ist aber ein Standard und keine universelle Garantie. Statisches oder serverseitiges HTML beweist für Ihre produktiven URLs nicht automatisch Crawlability, Indexierung, Rankings oder Core Web Vitals. Die Islands-Architektur hydratisiert nur die Komponenten, die Sie mit einer client:*-Direktive markieren — alles andere liefert HTML ohne eigene Hydration-JS aus, auch wenn Seitenskripte, andere Islands und Router-Erweiterungen an anderer Stelle noch JavaScript hinzufügen können. Astro erzeugt Meta-Tags, Canonicals, Sitemaps oder strukturierte Daten nicht automatisch — richten Sie diese ausdrücklich ein, idealerweise validiert durch Content Collections und Zod. Server Islands (für die ein Adapter erforderlich ist) liefern im Anfangsdokument die statische Hülle mit Fallback-Inhalt und rufen den zurückgestellten Inhalt danach unabhängig ab — prüfen Sie, was ein konkreter Crawler tatsächlich abruft, statt es anzunehmen. View Transitions verwenden history.pushState und sind SEO-sicher; Google crawlt die zugrunde liegenden MPA-Seiten normal. Ich betreibe patrickstox.com mit Astro, und die folgenden Funktionen sind die, die ich tatsächlich nutze — validiert gegen die bereitgestellte Website, nicht nur gegen die lokale Entwicklungsumgebung.

Evidence for this claim Astro prerenders pages as static HTML by default and only sends client JavaScript for explicitly hydrated components. Scope: Astro default static output and islands architecture. Confidence: high · Verified: Astro: Why Astro

Wie Astro das JavaScript-Rendering-Problem vollständig umgeht

Der gesamte Grund, warum JavaScript-SEO schwierig ist, liegt in der zweiten Welle. Google ruft zuerst Ihr rohes HTML ab und stellt die Seite später in einem Headless-Chromium zur Darstellung in eine Warteschlange — und genau diese Warteschlange ist das Risiko. Googles eigene Dokumentation beschreibt es so: “Googlebot queues all pages with a 200 HTTP status code for rendering unless a robots meta tag tells Google not to index the page. The page may stay on this queue for a few seconds, but it can take longer than that.” (Übersetzung) „Googlebot stellt alle Seiten mit einem HTTP-Statuscode 200 zur Darstellung in eine Warteschlange, sofern ein robots-Meta-Tag Google nicht anweist, die Seite nicht zu indexieren. Die Seite kann einige Sekunden in dieser Warteschlange bleiben, aber es kann auch länger dauern.“ Bei einer clientseitig gerenderten SPA existiert Ihr Inhalt erst, wenn diese Rendering-Welle ausgeführt wird.

Astros standardmäßiger Ausgabemodus ist static: Seiten und Endpunkte werden zur Build-Zeit in eine vollständige HTML-Datei prerendered. Für eine Route in diesem Standardmodus ist das rohe HTML also die gerenderte Seite. Evidence for this claim Astro uses static output and prerenders routes at build time by default. Scope: Astro default output mode; routes can opt out of prerendering. Confidence: high · Verified: Astro: On-demand rendering Es gibt für diese Route keine zweite Welle abzuwarten, weil nichts mehr ausgeführt werden muss. Googlebot sieht den vollständigen Inhalt beim ersten Abruf. Wie Joost de Valk (Gründer von Yoast) sagt: „Aus SEO-Sicht ist statisches HTML auf einem CDN ein besserer Ausgangspunkt, als ihn die meisten CMS jemals bieten werden.“

Das ist allerdings der Standard — keine universelle Eigenschaft jeder Route. Setzen Sie output: 'server', wechselt der Standard zu On-Demand-Rendering (mehr dazu weiter unten). Auch in einem Projekt mit statischem Standardmodus kann ein Adapter einer einzelnen Route mit export const prerender = false den Ausstieg ermöglichen. Nichts davon wird allein durch die Architektur garantiert: Statisches oder serverseitiges HTML, Islands und Adapter garantieren für sich genommen weder Crawlability, Indexierung, Rankings noch Core Web Vitals — das hängt von der bereitgestellten Route und dem konkreten Crawler ab. Prüfen Sie es, statt anzunehmen, dass das Framework es erledigt.

Das hilft auch bei den Crawlern, die überhaupt nicht rendern können. Google weist ausdrücklich darauf hin, dass “not all bots can run JavaScript” (Übersetzung) „Nicht alle Bots können JavaScript ausführen“ — und das ist 2026 für die meisten KI-Crawler und viele Tools von Drittanbietern Realität. Astros HTML-first-Ausgabe ist überall dort, wo tatsächlich prerendered wird, für alle diese Bots lesbar, nicht nur für Googlebot. (Das ist derselbe Punkt, den ich in SEO für ein Headless CMS mache: Der Rendering-Modus ist das Produkt.)

Islands-Architektur: JS nur dort, wo Sie es anfordern

Astro rendert Ihre Komponenten zu HTML und liefert in den eigenen Worten “just HTML & CSS, stripping out all client-side JavaScript automatically.” (Übersetzung) „Nur HTML und CSS, wobei sämtliches clientseitiges JavaScript automatisch entfernt wird“. Interaktivität ist optional. Sie markieren eine Komponente mit einer client:*-Direktive — client:load, client:idle oder client:visible — und nur dieses Island wird mit JavaScript hydratisiert. Alles andere bleibt statisches HTML. Evidence for this claim Astro client directives selectively hydrate interactive islands while other components remain static HTML. Scope: Astro islands and client directives. Confidence: high · Verified: Astro: Islands

Für SEO ist das nahezu ideal. Der Inhalt, den Googlebot indexieren muss, ist einfaches HTML, und Ihre interaktiven Widgets ziehen ihn nicht herunter. client:visible ist besonders nützlich: Eine Komponente unterhalb des sichtbaren Bereichs beginnt erst mit der Hydration, wenn sie in den sichtbaren Bereich scrollt, und blockiert daher niemals Ihr LCP. Das Konzept stammt von Jason Miller (dem Erfinder von Preact), der „das Rendern von HTML-Seiten auf dem Server und das Einfügen von Platzhaltern oder Slots um hochdynamische Bereiche“ für selektive Hydration beschrieben hat.

Zwei Nuancen verdienen eine präzise Darstellung, weil Berichte von Wettbewerbern sie häufig verwischen:

  • client:only ist etwas anderes. Anders als client:load/client:idle/client:visible überspringt eine client:only-Komponente das serverseitige Rendering vollständig — sie erzeugt auf dem Server überhaupt kein HTML. Alles Indexierbare, das nur in einer client:only-Komponente liegt, ist nicht in dem Dokument enthalten, das Googlebot abruft; es existiert erst, nachdem der Browser es hydratisiert hat. Legen Sie dort keine primären Inhalte ab.
  • Das ist selektive Hydration, keine Resumability. Astro führt den Client-Code jedes Islands im Browser von Grund auf neu aus. Es setzt keinen Ausführungszustand fort, der auf dem Server serialisiert wurde, wie es ein Resumability-Modell (zum Beispiel das von Qwik) tut. In Texten werden beide Konzepte vermischt — sie sind nicht derselbe Mechanismus.
Evidence for this claim A client:only component skips server rendering, so indexable content placed only inside it cannot be assumed to exist in the initial page HTML. Scope: client and server islands Confidence: high · Verified: Template directives reference

Und eine nicht hydratisierte Komponente ist nicht das gesamte JavaScript-Bild einer Seite. „Zero JS“ beschreibt eine Komponente ohne client:*-Direktive — Astro kann trotzdem Seitenskripte in <script>-Tags, den View-Transitions-Router und andere Islands an anderer Stelle derselben Seite ausliefern. Beschreiben Sie, was pro Komponente bzw. Route ausgeliefert wird, nicht pauschal, was auf der ganzen Seite geschieht.

Was Astro nicht automatisch erledigt

Astro erzeugt sauberes semantisches HTML — und in Bezug auf SEO sonst nichts. Es gibt standardmäßig keine Metadaten, keine Canonical-URL, keine Sitemap und keine strukturierten Daten. Der Mythos, „Astro sei automatisch für SEO optimiert“, ist genau das: ein Mythos. Sie sind zuständig für:

  • Meta-Tags (Titel, Beschreibung, Open Graph, Twitter)
  • Canonical-URLs
  • Die Sitemap (über die offizielle Integration)
  • Strukturierte Daten / JSON-LD
  • robots.txt

Astro ist die beste Grundlage, die ich bisher verwendet habe, aber es ist eine Grundlage und kein fertiges Haus.

Die Sitemap: @astrojs/sitemap

Installieren Sie die Sitemap mit npx astro add sitemap. Sie crawlt Ihre statisch erzeugten Routen und gibt zur Build-Zeit eine sitemap-index.xml sowie aufgeteilte sitemap-0.xml-Dateien aus. Zwei Dinge bereiten Probleme:

Evidence for this claim Astro's official sitemap integration generates sitemap files from statically generated routes. Scope: Astro @astrojs/sitemap integration. Confidence: high · Verified: Astro: Sitemap integration
  • Sie müssen site: in astro.config.mjs setzen. Ohne diese Angabe erzeugt die Integration stillschweigend nichts. Das ist die häufigste Ursache für „Wo ist meine Sitemap?“
  • Sie müssen die Sitemap-Zeile selbst zu robots.txt hinzufügen. Astro erledigt das nicht.

Für Kontrolle schließt filter() Routen aus (Preview-/Draft-Seiten — genau dafür verwende ich es auf dieser Website), mit serialize() können Sie lastmod/changefreq/priority setzen, und die Option i18n gibt hreflang-Einträge in der Sitemap aus. Das ist in der aktuellen Dokumentation von @astrojs/sitemap so festgelegt — prüfen Sie es gegen Ihre installierte Version, wenn Sie eine ältere Version verwenden; das Verhalten von Integrationen hat sich zwischen Major-Versionen bereits geändert.

Der Umfang, der oft übersehen wird: Die Integration entdeckt statisch erzeugte Routen. Wenn einige Ihrer URLs nur zur Laufzeit existieren — serverseitig gerenderte Routen (output: 'server') oder Routen, die bei Bedarf statt zur Build-Zeit erzeugt werden — nehmen Sie nicht an, dass sie in der Sitemap stehen. Fügen Sie sie mit customPages ausdrücklich hinzu und öffnen Sie nach einem Build tatsächlich sitemap-index.xml, um ihre Aufnahme zu bestätigen. Vertrauen Sie „die Integration erledigt das“ nicht für etwas, das keine statische Build-Zeit-Route ist.

Meta-Tags und Canonicals: das BaseLayout-Muster

Astro hat keine spezielle <Head>-Komponente — Sie steuern <head> direkt in .astro-Dateien. Das Standardmuster (und das, was ich verwende) ist ein einzelnes BaseLayout.astro, das title, description und canonicalURL als Props übernimmt und den Head schreibt. Setzen Sie den Canonical auf jeder Seite ausdrücklich und halten Sie ihn mit og:url konsistent. Sie brauchen keine Bibliothek, aber das Community-Paket astro-seo (npm) ist ein praktischer Wrapper aus einer Komponente für Titel/Beschreibung/OG/Twitter/Canonical, wenn Sie einen möchten.

Content Collections als SEO-Sicherheitsnetz

Das ist Astros unterschätztes SEO-Feature. Content Collections sind eine typsichere Inhaltsschicht für Markdown/MDX/JSON mit Zod-Schemavalidierung. Dadurch können Sie title und description zu Pflichtfeldern machen — fehlt eines auf einer Seite, schlägt der Build fehl. Sie können nicht versehentlich eine Seite ohne Titel ausliefern. Abfragefunktionen (getCollection(), getEntry()) erzeugen zur Build-Zeit statische Seiten, sodass die Ausgabe bei der Bereitstellung einfaches HTML ist. Und weil MDX rohes Markdown als Quelle der Wahrheit bewahrt, sind diese Dateien auch saubere Quellinhalte für KI-Crawler und Muster im Stil von llms.txt. Diese Website selbst basiert auf Content Collections mit Zod-validiertem Frontmatter.

astro:assets: Bilder richtig verwenden (mit einer Falle)

Die Komponente <Image /> konvertiert automatisch in WebP, ermittelt Abmessungen, um „Cumulative Layout Shift (CLS) zu vermeiden“, setzt standardmäßig loading="lazy" und verlangt alt — ein fehlendes alt ist ein Compile-Fehler. <Picture /> erweitert dies um AVIF/WebP-/Fallback-<source>-Elemente.

Die Falle: Das automatische loading="lazy" ist für Ihr LCP-Bild (normalerweise das Hero-Bild) falsch. Lazy Loading Ihres wichtigsten Bildes verzögert es. Überschreiben Sie bei Bildern oberhalb des sichtbaren Bereichs die Werte mit loading="eager" und fetchpriority="high". Remote-Bilder benötigen ausdrücklich width und height.

Server Islands: Was Crawler tatsächlich sehen

Server Islands (Astro 4.12+) sind die Funktion, die in den meisten Wettbewerberleitfäden falsch beschrieben wird. Mit server:defer rendert eine Komponente unabhängig von der Hauptseite auf dem Server. Die statische Hülle wird sofort ausgeliefert; laut Astros Dokumentation wird „Ihre Seite sofort mit jedem angegebenen Fallback-Inhalt als Platzhalter gerendert. Anschließend wird der eigene Inhalt der Komponente auf dem Client abgerufen und angezeigt, sobald er verfügbar ist.“

Zwei Dinge müssen präzise sein. Erstens benötigen Server Islands einen Adapter — sie sind eine On-Demand-Funktion und werden nicht von selbst durch einen rein statischen Build erzeugt. Zweitens lautet die Abfolge: Das Anfangsdokument wird mit dem von Ihnen konfigurierten Fallback-Inhalt ausgeliefert, und der echte Inhalt des Islands ist eine separate, unabhängige Anfrage, die nach dem Laden der Seite über einen eigenen Endpunkt abgerufen wird. Das setzt eine klare Untergrenze für den Inhalt des ersten Dokuments — ohne direkte Tests Ihrer bereitgestellten URLs würde ich daraus nichts Allgemeines über das weitere Verhalten jedes konkreten Crawlers ableiten.

Die SEO-Folge ist konkret: Das statische HTML, das ein Crawler beim ersten Abruf liest, enthält Ihren Fallback-Inhalt, nicht den zurückgestellten Inhalt des Islands. Das ist ideal für das, wofür Server Islands gedacht sind — personalisierte, sitzungsbezogene Dinge (Anmeldestatus, Warenkorbanzahl, Empfehlungen), die ohnehin nicht gecacht oder indexiert werden sollten. Für primäre indexierbare Inhalte ist es falsch. Legen Sie alles, was ranken soll, in die Hauptvorlage von Astro und überlassen Sie den dynamischen Teil den Server Islands.

Ausgabemodi: static vs. server und das Überschreiben pro Route

Astros standardmäßiger Ausgabemodus ist static — Seiten und Endpunkte werden zur Build-Zeit als HTML prerendered. Setzen Sie output: 'server' in astro.config.mjs, wechselt der Standard zu On-Demand-Rendering: Seiten werden pro Anfrage gerendert (mit einem Adapter), was für Authentifizierung, Echtzeitdaten oder Personalisierung jenseits der Möglichkeiten von Server Islands nützlich ist. In beiden Modi können Sie den Standard pro Route überschreiben: In einem Projekt mit statischem Standardmodus aktiviert export const prerender = false für eine Route On-Demand-Rendering; in einem Projekt mit Server-Standardmodus aktiviert export const prerender = true für eine Route wieder das Rendering zur Build-Zeit. „Meine Website ist statisch“ oder „meine Website verwendet SSR“ stimmt daher selten für jede Route — prüfen Sie die Einstellung pro Route und nicht nur die Konfiguration auf oberster Ebene.

Evidence for this claim Astro uses static output and prerenders routes at build time by default. Scope: Astro default output mode; routes can opt out of prerendering. Confidence: high · Verified: Astro: On-demand rendering

Aus rein SEO-technischer Sicht sind prerendered und On-Demand-HTML gleichwertig — beide liefern beim ersten Abruf vollständiges HTML an einen Crawler, sobald Sie tatsächlich bestätigt haben, dass die Route einen 200-Status mit vollständigem Markup zurückgibt. On-Demand-Routen können ihr HTML streamen, und langsame Daten oder Netzwerkbedingungen können spätere Abschnitte verzögern. Eine gestreamte Antwort ist daher kein automatischer Beweis, dass jeder Inhalt angekommen ist — prüfen Sie es, statt es anzunehmen. Der echte Unterschied zwischen den Modi ist operativer Natur: Prerendered-Inhalt bleibt bis zum nächsten Build (oder einer separat eingerichteten Aktualisierung zur Laufzeit) unverändert und wird direkt vom CDN-Rand ausgeliefert; On-Demand-Inhalt ist stets aktuell, hängt aber davon ab, dass Adapter und Laufzeit in Produktion funktionieren. Behandeln Sie dies nicht als SEO-Entscheidung — wählen Sie nach Datenaktualität und Betrieb und validieren Sie danach die bereitgestellten Routen, Statuscodes, Weiterleitungen und Response-Header, statt von einem lokalen Entwicklungserfolg auszugehen.

View Transitions: trotz SPA-Gefühl SEO-sicher

Astros <ClientRouter /> (früher <ViewTransitions />) bietet eine SPA-ähnliche weiche Navigation mit der View-Transitions-API des Browsers und der History API. Der entscheidende Punkt: Die Navigation verwendet history.pushState, genau das, was Google für clientseitige Navigation empfiehlt — Google warnt, dass fragmentbasierte (#hash-)URLs etwas sind, das es „nicht zuverlässig auflösen kann“. Entscheidend ist: View Transitions sind eine browserseitige Erweiterung. Wenn Googlebot crawlt, fordert er jede URL an und erhält eine normale, vollständige HTML-Seite — die darunterliegende MPA bleibt unverändert. Die Übergänge beeinflussen nur, was ein Mensch im Browser sieht.

Nein, View Transitions machen Ihre Astro-Website nicht zu einer SPA und sie beschädigen SEO nicht. Eine erwähnenswerte Lücke: Astros Dokumentation zu View Transitions enthält keinen SEO-Abschnitt — vermutlich hält sich deshalb der Mythos, dass die Funktion SEO schadet. Rufen Sie zur Prüfung Ihrer eigenen Website einige URLs direkt ab und bestätigen Sie, dass jede vollständiges HTML zurückgibt — vertrauen Sie nicht darauf, prüfen Sie Ihre eigene Bereitstellung.

Häufige Astro-SEO-Fehler

  1. Annehmen, dass Astro SEO für Sie erledigt. Astro erledigt HTML. Meta, Canonicals, Sitemap und Schema sind Ihre Aufgabe.
  2. site: in der Konfiguration vergessen — Ihre Sitemap wird stillschweigend nicht erzeugt.
  3. Die Sitemap nicht zu robots.txt hinzufügen — Astro tut das nicht.
  4. Das LCP-Bild lazy laden — überschreiben Sie beim Hero-Bild eager + fetchpriority.
  5. Indexierbare Inhalte in ein Server Island legen — Crawler sehen den Fallback statt des Inhalts, und Server Islands benötigen zunächst überhaupt einen Adapter.
  6. Einem perfekten Lighthouse-Score hinterherlaufen und dort aufhören. Geschwindigkeit ist ein Ranking-Signal, nicht das Ranking-Signal. Eine schnelle leere Seite rankt nicht — Inhalt, Links und E-E-A-T leisten weiterhin die Hauptarbeit.
  7. Indexierbare Inhalte nur in eine client:only-Komponente legen. Anders als die übrigen client:*-Direktiven überspringt client:only das serverseitige Rendering vollständig — für diese Komponente gibt es bis zur Hydration durch den Browser kein HTML.
  8. „Astro ist statisch/schnell“ als Ergebnisgarantie behandeln. Statisches oder On-Demand-HTML, Islands und Adapter sind Mechanismen — sie garantieren für sich genommen weder Crawlability, Indexierung, Rankings noch Core Web Vitals. Validieren Sie die bereitgestellte Route und nicht das Architekturdiagramm.

Wo dies in den Cluster passt

Astro ist eine konkrete, ungewöhnlich SEO-freundliche Antwort auf die Fragen zu Rendering, die JavaScript SEO aufwirft, und ein beliebtes Frontend für Headless-CMS-Setups. Die Performance-Seite ist direkt mit Core Web Vitals im Web-Performance-Cluster verbunden, und die Disziplin, zu prüfen, ob der Inhalt tatsächlich im HTML steht, ist dieselbe wie in den Crawling- und Indexierungs-Clustern.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.