typo3-indexnow — neue Seiten in Minuten im Index.
Eine neue Seite wartet, bis ein Crawler zufällig vorbeikommt. Das kann Tage dauern. typo3-indexnow meldet Suchmaschinen über IndexNow, welche Seiten veröffentlicht, geändert, zeitgesteuert freigeschaltet oder entfernt wurden. Bing, Yandex, Seznam, Naver, Yep und Amazon teilen jede Meldung untereinander. Bings Index speist ChatGPT-Suche und Copilot – eine Seite kann dort am selben Tag zitierbar sein.
- Composer-Paket:
koh/typo3-indexnow - Basis:koh/indexnow, der framework-unabhängige Client
- TYPO3: 14 · PHP: 8.5+ · MIT · Quellcode auf GitHub
TL;DR — Passt das zu meinem Setup?
Nutze es wenn …
- neue Artikel oder Produktseiten schnell in Bing und den KI-Suchen auftauchen sollen
- Seiten zeitgesteuert online gehen und die Suchmaschine das zur Startzeit erfahren soll, nicht Tage später
- entfernte oder versteckte Seiten schnell aus dem Index verschwinden sollen
Nutze es nicht wenn …
- der TYPO3-Scheduler nicht läuft: Die Meldungen verschickt ein Scheduler-Task alle fünf Minuten
- du Google erreichen willst – Google nimmt an IndexNow nicht teil
- TYPO3 < 14 oder PHP < 8.5 im Einsatz ist
Aufwand
Ein Composer-Paket und eine Zeile in der Site-Konfiguration. Keinen Schlüssel erzeugen, keine Datei hochladen, keinen Cronjob anlegen.
So funktioniert es
Redaktion speichert, verschiebt, löscht Startzeit läuft ab
Workspace wird veröffentlicht │
│ DataHandler-Hook │ Scan pro Lauf
▼ ▼
Queue tx_kohindexnow_queue (eine Zeile pro Seite und Sprache)
│
▼
indexnow:run (Scheduler, alle fünf Minuten)
│ URL erzeugen, Regeln prüfen, nach Host gruppieren
▼
ein Request pro Host ──► api.indexnow.org ──► Bing, Yandex, Seznam und weitere| Auslöser | Gemeldet wird |
|---|---|
| Seite oder Inhaltselement gespeichert, verschoben, gelöscht, wiederhergestellt | Die Seite in der geänderten Sprache; bei Sichtbarkeit, Zugriff oder SEO-Flags alle Sprachen; beim Verschieben auch die alte Seite |
| Workspace veröffentlicht | Was damit öffentlich wurde |
| Start- oder Endzeit läuft ab | Die Seite, obwohl niemand gespeichert hat |
| Erster Lauf mit aktivem Host | Jede sichtbare, indexierbare Seite in jeder Sprache |
Eine geänderte Seite wird auch gemeldet, wenn sie jetzt versteckt, gelöscht oder noindex ist. Die Suchmaschine muss neu crawlen, um das zu erfahren. Die Elternseite geht mit, weil ein neuer Artikel die Liste ändert, in der er steht.
Kein Schlüssel zu verwalten
Der Schlüssel wird pro Host aus dem Encryption-Key der Installation abgeleitet (HMAC-SHA256). Jede Replica rechnet denselben, jeder Host bekommt einen eigenen, gespeichert wird nichts. Die Schlüsseldatei liefert eine Middleware unter /<key>.txt aus.
Was nie gemeldet wird
Eine Meldung lässt sich nicht zurücknehmen, und jede teilnehmende Suchmaschine bekommt sie. Deshalb prüft die Extension vor jedem Request, was rausgehen darf.
| Regel | Was sie verhindert |
|---|---|
Nur im Application-Context Production | Lokale Installationen und Testsysteme schweigen. |
| Host-Policy der Library | IP-Adressen, .localhost, .test, .local, .internal und Hosts mit dev, staging oder preview im Namen werden nie gemeldet – auch wenn sie in Production laufen. Dort existiert auch die Schlüsseldatei nicht. |
| Zugriffsgeschützte Seiten | Eine Frontend-Benutzergruppe auf der Seite, ihrer Übersetzung oder einer vererbenden Elternseite: Die URL bleibt privat, auch wenn die Seite sich ändert. |
| Startzeit in der Zukunft | Eine zeitgesteuerte Seite wird erst gemeldet, wenn sie online ist – auch wenn sie vorher aus dem Workspace veröffentlicht wurde. |
| Seitentypen ohne Dokument | Links, Shortcuts, Mount Points, Trenner, Ordner und Papierkorb, wie in der XML-Sitemap des Core. |
| Workspace-Entwürfe | Gemeldet wird erst, was veröffentlicht ist. |
Weitere Hosts sperrt die Site-Einstellung indexnow.deniedHostSuffixes.
Neue Inhalte schneller in Bing, ChatGPT-Suche und Copilot? Ich helfe bei Einrichtung, Detailseiten für News oder Produkte und beim Monitoring der Meldungen. Anfragen →
Installation und Aktivierung
Zwei Schritte
- Paket installieren:
composer require koh/typo3-indexnow, danachvendor/bin/typo3 extension:setup. Das Setup legt den Scheduler-Task an, der alle fünf Minutenindexnow:runausführt. - Das Set in jeder Site eintragen, die melden soll, in
config/sites/<site>/config.yaml:
dependencies:
- koh/indexnow
Beim ersten Lauf mit aktivem Host wird die ganze Site einmal gemeldet. Das ist der Go-live; danach gehen nur noch Änderungen raus.
Kommandos
vendor/bin/typo3 indexnow:status # pro Host: aktiv oder warum nicht, Schlüsseldatei, Queue
vendor/bin/typo3 indexnow:run # was der Scheduler-Task ausführt
vendor/bin/typo3 indexnow:submit-all # alle indexierbaren Seiten erneut einreihen
indexnow:status ist die Antwort auf „Warum wird nichts gemeldet?“.
Site-Einstellungen
| Einstellung | Standard | Wirkung |
|---|---|---|
indexnow.enabled | true | Schalter für die Site |
indexnow.key | leer | Leer: pro Host abgeleitet. Nur setzen, um einen bestehenden Schlüssel zu behalten |
indexnow.excludedDoktypes | 3, 4, 6, 7, 199, 254, 255 | Seitentypen, die nie gemeldet werden |
indexnow.includeParentPage | true | Elternseite einer geänderten Seite mitmelden |
indexnow.deniedHostSuffixes | leer | Weitere Hosts, die nie gemeldet werden |
Zustellung: Queue, Wiederholung, Abbruch
Während eine Redakteurin speichert, passiert nichts Teures. Der Hook merkt sich die Datensätze und schreibt die Queue einmal am Ende des DataHandler-Laufs. URLs entstehen erst im Worker, aus dem rohen Seitendatensatz – deshalb gibt es auch für eine gelöschte Seite noch eine URL. Zwanzigmal speichern vor dem nächsten Lauf meldet die Seite einmal.
| Antwort | Was passiert |
|---|---|
| Angenommen | Die Zeilen werden entfernt. |
| Vorübergehend (429, 5xx, keine Verbindung, 403 solange die Schlüsseldatei noch nicht abrufbar ist) | Warten mit exponentiellem Backoff von einer Minute bis sechs Stunden, Retry-After wird beachtet. Nach acht Versuchen ist Schluss. |
| Abgelehnt (400, 422) | Die Zeilen werden entfernt und der Fehler geloggt, denn derselbe Request würde wieder abgelehnt. Der Scheduler-Task endet mit Status 1. |
HTTP läuft über den konfigurierten TYPO3-Client: Proxy, CA-Bundle und HTTP.allowed_hosts gelten, zehn Sekunden Timeout, keine Weiterleitungen.
Erweitern und Grenzen
Drei PSR-14-Events
ResolveRecordPagesEvent– welche Seiten einen geänderten Datensatz zeigen. Standard ist die Seite, auf der er liegt. Wird ein Datensatz auf einer Detailseite woanders gerendert (News, Produkte, Termine), braucht es einen Listener der Extension, der er gehört.BeforeUrlsSubmittedEvent– URLs ergänzen, die sich mit Seiten ändern, etwa ein Feed oder einellms.txt.AfterUrlsSubmittedEvent– was gesendet wurde und wie die Suchmaschine geantwortet hat, fürs Monitoring.
Grenzen
- Google nimmt nicht teil. Für Google bleiben Sitemap und Search Console.
- IndexNow ist ein Hinweis, keine Garantie: Ob und wann eine Seite im Index landet, entscheidet die Suchmaschine.
- Eine gemeldete URL lässt sich nicht zurücknehmen. Deshalb die Regeln oben.
Häufige Fallstricke
- Scheduler läuft nicht. Ohne Scheduler füllt sich die Queue, und nichts geht raus.
indexnow:statuszeigt die Queue-Länge. - Falscher Application-Context. Außerhalb von
Productionmeldet die Extension nichts. Das ist Absicht, führt aber gern zur Frage, warum Staging still bleibt. - Detailseiten von Datensätzen. News- oder Produktdatensätze liegen meist in einem Ordner. Ohne Listener für
ResolveRecordPagesEventwird ihre Detailseite nicht gemeldet. - Neuer Encryption-Key. Der Schlüssel hängt daran. Wer den Encryption-Key tauscht, bekommt neue IndexNow-Schlüssel; das ist erlaubt, die Suchmaschine liest die neue Datei.
Neue Inhalte in den Index bringen?
Wenn neue Seiten Tage brauchen, bis Bing und die KI-Suchen sie kennen, hilft typo3-indexnow. Sprich mich für die Einrichtung, Listener für deine Detailseiten oder das Monitoring der Meldungen an.
Oder direkt schreiben: mail@ole-hartwig.eu