Next.js SEO: Wie wird meine Website von ChatGPT zitiert?
Machen Sie jede Seite ohne JavaScript lesbar, beschreiben Sie sie und lassen Sie den Such-Crawler von ChatGPT zu. In Next.js heißt das: Server-Komponenten mit dem Text im HTML, die Metadata API für Titel, kanonische URL und Sprachen, app/robots.ts mit Zulassung von OAI-SearchBot, app/sitemap.ts und JSON-LD auf der Seite. Nichts davon garantiert eine Zitierung. Es beseitigt aber die Gründe, aus denen ChatGPT Ihre Seite nicht nutzen kann.
Fakten
- OpenAI sagt, dass Websites, die sich von OAI-SearchBot abgemeldet haben, in den Antworten der ChatGPT-Suche nicht gezeigt werden. Eine Änderung der robots.txt kann etwa 24 Stunden brauchen, bis sie wirkt. (OpenAI: Overview of OpenAI crawlers)
- OpenAI sagt, dass das Sperren von GPTBot nur signalisiert, dass Inhalte nicht zum Training seiner Modelle genutzt werden sollen. ChatGPT-User-Besuche gehen von Nutzern aus und entscheiden nicht darüber, was in der Suche erscheint. (OpenAI: Overview of OpenAI crawlers)
- Next.js sagt, dass der metadata-Export und generateMetadata, verfügbar seit v13.2.0, nur in Server-Komponenten funktionieren, damit die Metadaten im ersten HTML stehen. (Next.js Doku: generateMetadata)
- Next.js erzeugt seit v13.3.0 eine robots.txt aus app/robots.ts, mit Regeln je User-Agent. (Next.js Doku: robots.txt)
- app/sitemap.ts unterstützt seit Next.js v14.2.0 alternative Sprach-URLs, und das Limit von Google liegt bei 50.000 URLs pro Sitemap. (Next.js Doku: sitemap.xml)
Welchen OpenAI-Crawler muss ich zulassen?
OAI-SearchBot entscheidet, ob die ChatGPT-Suche Ihre Website zeigen kann. Die drei haben unterschiedliche Aufgaben, sperren oder erlauben Sie sie deshalb getrennt.
// app/robots.ts
export default function robots(): MetadataRoute.Robots {
return {
rules: [
{ userAgent: "*", allow: "/" },
// ChatGPT-Suche: muss zugelassen sein, um in Antworten gezeigt zu werden
{ userAgent: "OAI-SearchBot", allow: "/" },
// Modelltraining: Ihre Entscheidung, sie entscheidet nicht über die Suche
{ userAgent: "GPTBot", allow: "/" },
],
sitemap: "https://www.example.com/sitemap.xml",
};
}| User-Agent | Was er tut | Wirkung einer Sperre |
|---|---|---|
| OAI-SearchBot | Crawlt Websites für die Suchfunktionen von ChatGPT | Ihre Seiten werden in den Antworten der ChatGPT-Suche nicht gezeigt |
| GPTBot | Crawlt Inhalte, die zum Training der Modelle von OpenAI dienen können | Inhalte werden nicht zum Training genutzt; die Suche ist nicht betroffen |
| ChatGPT-User | Besucht eine Seite, wenn die Frage eines Nutzers sie braucht | robots.txt gilt dafür möglicherweise nicht; über die Suche entscheidet er nicht |
Warum muss der Text serverseitig gerendert sein?
Weil die Crawler von ChatGPT das HTML lesen, das Ihr Server ausliefert, und kein JavaScript ausführen. Im App Router sind Seiten standardmäßig Server-Komponenten. Text, der nach dem Laden in einer Client-Komponente abgerufen wird, fehlt in diesem HTML. Lassen Sie die Seite eine Server-Komponente sein und verlagern Sie nur die interaktiven Teile in Dateien mit "use client".
Was sollten die Metadaten jeder Seite enthalten?
Einen eindeutigen Titel und eine eindeutige Beschreibung, eine kanonische URL und auf mehrsprachigen Websites die Sprachalternativen. generateMetadata baut sie für jede Seite; Next.js macht aus den Alternativen rel="canonical"- und hreflang-Links. JSON-LD gehört als einfaches script-Tag auf die Seite, mit "<" maskiert, wie es die Next.js-Doku zeigt, und muss dasselbe sagen wie der sichtbare Text.
// app/guides/[slug]/page.tsx (eine Server-Komponente: ohne "use client")
export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }): Promise<Metadata> {
const { slug } = await params;
const page = await getPage(slug);
return {
title: page.title,
description: page.description,
alternates: {
canonical: `/guides/${slug}`,
languages: { "pt-BR": `/pt/guides/${slug}`, es: `/es/guides/${slug}` },
},
};
}
export default async function Page({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const page = await getPage(slug);
const jsonLd = { "@context": "https://schema.org", "@type": "Article", headline: page.title };
return (
<article>
<script type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd).replace(/</g, "\\u003c") }} />
<h1>{page.title}</h1>
<p>{page.answer}</p>
</article>
);
}Wie teste ich es wie ein Crawler?
Rufen Sie die Live-Seite ohne Browser ab und suchen Sie nach dem Antworttext, dem Titel, der kanonischen URL und dem JSON-LD. Steht der Text nicht im rohen HTML, kann ChatGPT ihn nicht zitieren.
# 1. Der Text steht im rohen HTML (ohne dass JavaScript läuft) curl -s -A "OAI-SearchBot" https://www.example.com/guides/my-page | grep -i "a sentence from the answer" # 2. Titel, kanonische URL und JSON-LD sind ebenfalls vorhanden curl -s https://www.example.com/guides/my-page | grep -iE "<title>|rel=\"canonical\"|ld\+json" # 3. robots.txt und Sitemap antworten curl -s https://www.example.com/robots.txt curl -s https://www.example.com/sitemap.xml | grep -c "<loc>"
Bringt ein perfektes Setup mir eine Zitierung?
Nein. Das Setup macht Ihre Seiten lesbar und zulässig. ChatGPT wählt Quellen danach, wie gut eine Seite die Frage beantwortet. Der Inhalt muss trotzdem die klarste Antwort auf das sein, was Ihre Käufer fragen.
Schritt für Schritt
- robots prüfen. Ergänzen Sie app/robots.ts, die OAI-SearchBot zulässt und auf die Sitemap verweist. Entscheiden Sie GPTBot separat.
- Seiten auf dem Server halten. Stellen Sie sicher, dass jede öffentliche Seite eine Server-Komponente ist und ihr Haupttext im HTML steht.
- Metadaten ergänzen. Verwenden Sie generateMetadata für einen eindeutigen Titel, eine Beschreibung, eine kanonische URL und Sprachalternativen auf jeder Seite.
- JSON-LD und Sitemap ergänzen. Rendern Sie JSON-LD auf der Seite und listen Sie jede öffentliche URL in app/sitemap.ts auf.
- Die Live-Website testen. Führen Sie die curl-Prüfungen nach dem Deployment aus, nicht auf localhost.
Häufige Fehler
- GPTBot und OAI-SearchBot mit einer gemeinsamen Regel sperren, obwohl nur das Training gesperrt werden sollte.
- Den Artikeltext in useEffect laden, sodass das HTML, das ein Crawler erhält, leer ist.
- Aus dem Root-Layout denselben Titel, dieselbe Beschreibung oder dieselbe kanonische URL auf jede Seite kopieren.
- JSON-LD, das Dinge behauptet, die die sichtbare Seite nicht sagt.
So löst easyIndex das
easyIndex passt gut zu einer Next.js-Website, weil die Arbeit im eigenen Repository bleibt: Ihr Coding-Agent schreibt die Seiten, und easyIndex gibt die Schritte über MCP vor, prüft jede Seite bei der Einreichung und kontrolliert sie auf der Live-Website. Ein Schritt gilt nur als erledigt, wenn easyIndex den Nachweis prüft, nicht auf Grundlage des Berichts des Agenten.
Danach zeigt das Dashboard KI-Besucher je Seite und welche Seiten KI-Crawler lesen. Ein Tarif mit allen Funktionen: 30 US$ pro Website und Monat, 7 Tage kostenlose Testphase mit einer Website.
Häufig gestellte Fragen
Sollte ich GPTBot sperren?
Das entscheiden Sie selbst. OpenAI sagt, GPTBot dient dem Training und OAI-SearchBot der Suche. Das Sperren von GPTBot allein nimmt Sie deshalb nicht aus der ChatGPT-Suche.
Brauche ich den Pages Router oder den App Router?
Beide können serverseitig gerendertes HTML ausliefern. Diese Anleitung nutzt den App Router, in dem Seiten standardmäßig Server-Komponenten sind und die Metadata API liegt.
Ist llms.txt Pflicht?
Nein. Die ChatGPT-Suche liest Ihre Seiten; eine Datei llms.txt ersetzt keinen Text im HTML.
Wie lange dauert es, bis eine Änderung der robots.txt wirkt?
OpenAI sagt, seine Suchsysteme brauchen nach einer Aktualisierung der robots.txt etwa 24 Stunden, um sich anzupassen.
Weiterlesen
- Können ChatGPT und Claude meine JavaScript-Website sehen?
- Welche KI-Crawler gibt es, und wie lasse ich sie in der robots.txt zu?
- Helfen strukturierte Daten (Schema), damit KI meine Website zitiert?
- Wie lasse ich mein Unternehmen von ChatGPT empfehlen?
- Wie mache ich GEO mit Claude Code oder Codex?
- Wie funktioniert easyIndex, was brauche ich, und wie lange dauert es bis zu Ergebnissen?
Zuletzt geprüft am .