Risolva le collisioni di slug con un suffisso numerico
Il risolutore di collisioni confronta lo slug esatto desiderato da Lei con quelli già occupati.
Esegui gratis nel browser
Se il valore è disponibile, lo restituisce senza modifiche. Se è già utilizzato, verifica alternative numeriche come -2, -3 e successive fino a trovare la prima libera. È un componente piccolo e deterministico per sistemi editoriali, importazioni, generatori di documentazione e qualsiasi flusso che debba assegnare un percorso URL univoco senza sostituire accidentalmente contenuti esistenti.
Conservi lo slug desiderato quando possibile
Un buon risolutore di collisioni deve modificare un URL soltanto quando è necessario. Inserisca il valore proposto in desired_slug e fornisca tutti i valori occupati in used_slugs. I confronti sono esatti e distinguono maiuscole e minuscole. Se la proposta non compare nell’insieme occupato, il risultato contiene lo slug originale e indica che non si è verificata alcuna collisione. Lo strumento non converte in minuscolo, non elimina spazi, non traslittera e non sostituisce la punteggiatura, perché tali trasformazioni appartengono alla fase precedente di creazione dello slug. Separare le responsabilità evita modifiche impreviste agli URL e rende il risultato riproducibile in build, migrazioni e test. Uno slug desiderato vuoto viene rifiutato anziché trasformato in un suffisso arbitrario, poiché ciò nasconderebbe un titolo mancante o una mappatura precedente difettosa. Le voci duplicate nell’elenco non incidono sulla risposta: vengono consolidate naturalmente durante la ricerca, senza richiedere pulizia preventiva.
Scelga il primo suffisso numerico disponibile
Quando lo slug esatto è occupato, la selezione inizia da 2, secondo la convenzione comune per cui il percorso senza suffisso rappresenta il primo elemento e quello successivo riceve -2. Il risolutore controlla quindi i candidati in ordine crescente: desiderato-2, desiderato-3, desiderato-4 e così via. Si ferma al primo candidato assente dall’insieme fornito. Gli spazi liberi vengono quindi riutilizzati in modo prevedibile. Per esempio, se report, report-2 e report-4 sono occupati, il risultato sarà report-3. Il confronto considera stringhe complete, perciò annual-report e report-old non causano collisioni. Una terminazione numerica già presente viene trattata come parte letterale del valore e non viene interpretata o riscritta: se Lei richiede release-2 ed è occupato, il primo candidato sarà release-2-2. Questo comportamento evita di presumere le intenzioni e garantisce che input identici producano sempre lo stesso output, senza dipendere da database, orologio, casualità, impostazioni locali o ordine di esecuzione.
Utilizzi il risultato in sicurezza nei flussi editoriali
Questa capacità è utile quando l’applicazione conosce già gli slug riservati. Raccolga tali valori, li invii insieme allo slug desiderato e utilizzi il risultato per il nuovo record. La risposta indica inoltre se si è verificata una collisione e, per un risultato con suffisso, quale numero è stato scelto. Questi metadati possono alimentare registri, anteprime o un messaggio che spieghi perché l’URL differisce dalla proposta iniziale. L’operazione non riserva il valore restituito: i sistemi con scritture simultanee devono comunque imporre un vincolo di unicità e riprovare con un elenco aggiornato se un altro processo acquisisce lo stesso slug. Nelle importazioni in blocco, aggiunga ogni assegnazione riuscita all’insieme locale prima di risolvere la riga successiva. Poiché il confronto è esatto, applichi prima e in modo coerente la propria politica URL, usando un generatore di slug se deve normalizzare maiuscole, Unicode, spazi o punteggiatura. Ogni richiesta API costa $0.002; la stessa logica deterministica può essere eseguita nel browser per controlli interattivi.
Casi d'uso
Pubblichi una pagina senza sostituirne un’altra
Mantenga il percorso preferito dall’editor se è libero, oppure assegni la prima alternativa numerata disponibile se è già occupato.
Importi record con URL univoci e stabili
Risolva ogni slug preparato rispetto ai percorsi esistenti e appena assegnati, così che i titoli ripetuti ricevano suffissi deterministici.
Generi percorsi per la documentazione
Impedisca a titoli o pagine generate duplicate di occupare lo stesso percorso, mantenendo indirizzi leggibili e prevedibili.
Domande frequenti
Che cosa accade se lo slug desiderato è libero?
Viene restituito senza modifiche e collision è false.
Quale suffisso viene provato per primo?
Il risolutore parte da -2, quindi controlla -3, -4 e valori superiori fino a trovare il primo libero.
Lo strumento converte il testo in uno slug URL?
No. Confronta ed estende il valore esatto ricevuto. Usi prima un generatore se deve normalizzare maiuscole, spazi, punteggiatura o Unicode.
I confronti distinguono maiuscole e minuscole?
Sì. Product e Product sono identici, mentre Product e product vengono considerati stringhe diverse.
La capacità riserva lo slug restituito?
No. Calcola un candidato dall’elenco ricevuto. Il sistema di archiviazione deve imporre l’unicità durante il salvataggio.
Quanto costa una richiesta API?
Ogni richiesta costa $0.002.
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo 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)Esempio di richiesta
{
"desired_slug": "product-guide",
"used_slugs": [
"product-guide",
"product-guide-2"
]
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.slug_collision_resolve",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Limiti
max_used_slugs | 10000 |
max_slug_chars | 10000 |
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |