Slug-Kollisionen mit fortlaufendem Nummernsuffix lösen
Der Kollisionslöser vergleicht Ihren gewünschten Slug exakt mit den bereits belegten Slugs.
Im Browser ausführen – kostenlos
Ist der Wert verfügbar, wird er unverändert zurückgegeben. Ist er vergeben, prüft das Werkzeug nummerierte Alternativen wie -2, -3 und weitere Werte, bis es die erste freie Variante findet. Es ist ein kleiner, deterministischer Baustein für Redaktionssysteme, Importe, Dokumentationsgeneratoren und jeden Ablauf, der einen eindeutigen URL-Pfad vergeben muss, ohne vorhandene Inhalte versehentlich zu überschreiben.
Behalten Sie den gewünschten Slug möglichst bei
Ein guter Kollisionslöser sollte eine URL nur ändern, wenn es wirklich nötig ist. Übermitteln Sie den vorgeschlagenen Wert in desired_slug und alle belegten Werte in used_slugs. Die Vergleiche erfolgen exakt und berücksichtigen Groß- und Kleinschreibung. Kommt der Vorschlag in der belegten Menge nicht vor, enthält das Ergebnis den ursprünglichen Slug und meldet, dass keine Kollision aufgetreten ist. Das Werkzeug wandelt nicht in Kleinbuchstaben um, entfernt keine Randzeichen, transliteriert nicht und ersetzt keine Satzzeichen. Solche Umformungen gehören in einen vorgelagerten Schritt zur Slug-Erzeugung. Die Trennung dieser Aufgaben verhindert unerwartete URL-Änderungen und macht Ergebnisse in Builds, Migrationen und Tests reproduzierbar. Ein leerer gewünschter Slug wird abgelehnt, statt daraus ein beliebiges Suffix zu bilden, denn dies würde einen fehlenden Titel oder eine fehlerhafte Zuordnung verschleiern. Doppelte Einträge in der Liste beeinflussen die Antwort nicht und müssen für ein stabiles Ergebnis nicht vorher bereinigt werden.
Wählen Sie das erste freie Nummernsuffix
Wenn der exakte Slug belegt ist, beginnt die Auswahl bei 2. Dies folgt der üblichen Konvention, nach der der Pfad ohne Suffix für das erste Element steht und das nächste Element -2 erhält. Anschließend werden Kandidaten aufsteigend geprüft: gewuenscht-2, gewuenscht-3, gewuenscht-4 und so weiter. Die Suche endet beim ersten Kandidaten, der in der übergebenen Menge fehlt. Dadurch werden Lücken vorhersehbar wiederverwendet. Sind beispielsweise report, report-2 und report-4 belegt, lautet das Ergebnis report-3. Verglichen werden vollständige Zeichenketten; Werte wie annual-report oder report-old lösen daher keine Kollision aus. Eine bereits vorhandene numerische Endung gilt als wörtlicher Bestandteil des gewünschten Werts und wird weder interpretiert noch umgeschrieben: Wird release-2 angefordert und ist dieser Wert belegt, lautet der erste Kandidat release-2-2. Dieses klare Verhalten vermeidet Vermutungen über Ihre Absicht und garantiert für gleiche Eingaben stets dieselbe Ausgabe, unabhängig von Datenbank, Uhrzeit, Zufall, Gebietsschema oder Ausführungsreihenfolge.
Nutzen Sie das Ergebnis sicher in Veröffentlichungsabläufen
Diese Funktion eignet sich für den Punkt, an dem Ihre Anwendung die reservierten Slugs bereits kennt. Sammeln Sie diese Werte, übermitteln Sie sie zusammen mit dem gewünschten Slug und verwenden Sie die Rückgabe für den neuen Datensatz. Die Antwort zeigt außerdem, ob eine Kollision vorlag und welche Nummer bei einem Ergebnis mit Suffix gewählt wurde. Diese Metadaten können Protokolle, Vorschauen oder Hinweise speisen, die eine Abweichung von der ursprünglichen URL erklären. Der Vorgang reserviert den zurückgegebenen Wert nicht. Systeme mit gleichzeitigen Schreibzugriffen sollten deshalb weiterhin eine Eindeutigkeitsbedingung erzwingen und mit einer aktualisierten Liste erneut versuchen, falls ein anderer Vorgang denselben Slug belegt. Ergänzen Sie bei Stapelimporten nach jeder erfolgreichen Zuweisung Ihre lokale Menge, bevor Sie die nächste Zeile verarbeiten. Da der Vergleich exakt ist, sollten Sie zuvor konsequent Ihre eigene URL-Regel anwenden und bei Bedarf Großschreibung, Unicode, Leerzeichen oder Satzzeichen mit einem Slug-Generator normalisieren. Jede API-Anfrage kostet $0.002; dieselbe deterministische Logik kann für interaktive Prüfungen im Browser laufen.
Anwendungsfälle
Veröffentlichen Sie eine Seite ohne Überschreiben
Behalten Sie den bevorzugten Redaktionspfad bei, wenn er frei ist, oder vergeben Sie die erste verfügbare nummerierte Alternative.
Importieren Sie Datensätze mit stabilen URLs
Prüfen Sie jeden vorbereiteten Slug gegen vorhandene und neu vergebene Pfade, damit wiederholte Titel deterministische Suffixe erhalten.
Erzeugen Sie Routen für Dokumentationen
Verhindern Sie, dass doppelte Überschriften oder generierte Seiten denselben Pfad beanspruchen, und erhalten Sie lesbare, vorhersehbare Adressen.
Häufige Fragen
Was geschieht, wenn der gewünschte Slug frei ist?
Er wird unverändert zurückgegeben und collision ist false.
Welches Suffix wird zuerst geprüft?
Der Löser beginnt mit -2 und prüft danach -3, -4 und höhere Werte, bis er den ersten freien findet.
Wandelt das Werkzeug Text in einen URL-Slug um?
Nein. Es vergleicht und erweitert den exakt übermittelten Wert. Verwenden Sie vorher einen Generator, wenn Großschreibung, Leerzeichen, Satzzeichen oder Unicode normalisiert werden sollen.
Berücksichtigt der Vergleich Groß- und Kleinschreibung?
Ja. Product und Product sind identisch, während Product und product als unterschiedliche Zeichenketten gelten.
Reserviert die Funktion den zurückgegebenen Slug?
Nein. Sie berechnet aus der Liste einen Kandidaten. Ihr Speichersystem muss beim Schreiben Eindeutigkeit erzwingen.
Was kostet eine API-Anfrage?
Jede Anfrage kostet $0.002.
Für Entwickler — API-Zugang
Alles auf dieser Seite ist auch per API verfügbar. Dieser Abschnitt richtet sich an Teams, die es in ihre eigenen Systeme einbinden möchten; alle anderen nutzen einfach das Tool oben.
Endpunkt
Authentifizierung per Bearer-Token. Ein einziger POST stellt die Aufgabe in die Warteschlange; das Ergebnis erhalten Sie per Webhook oder über einen signierten Link.
Aufruf aus Ihrem Stack
curl -X POST https://api.kit.forhosting.com/dev/slug-collision-resolve \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"desired_slug":"product-guide","used_slugs":["product-guide","product-guide-2"]}'const res = await fetch("https://api.kit.forhosting.com/dev/slug-collision-resolve", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"desired_slug": "product-guide",
"used_slugs": [
"product-guide",
"product-guide-2"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/slug-collision-resolve",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"desired_slug": "product-guide",
"used_slugs": [
"product-guide",
"product-guide-2"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/slug-collision-resolve", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"desired_slug":"product-guide","used_slugs":["product-guide","product-guide-2"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"desired_slug":"product-guide","used_slugs":["product-guide","product-guide-2"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/slug-collision-resolve", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Beispiel-Anfrage
{
"desired_slug": "product-guide",
"used_slugs": [
"product-guide",
"product-guide-2"
]
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.slug_collision_resolve",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}Die API arbeitet asynchron: Sie erhalten sofort eine task_id. Polling ist mit 1 Anfrage pro Sekunde erlaubt.
Preis
Der Preis steht auf der Seite – keine Tokens, keine Credits. Fehlgeschlagene Aufgaben werden nicht berechnet.
Limits
max_used_slugs | 10000 |
max_slug_chars | 10000 |
Fehler
| HTTP | Code | Bedeutung |
|---|---|---|
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |