# A robots.txt that blocks nothing by accident

robots.txt tells crawlers which URLs not to request. A named group replaces the * rules, so every group must repeat the Disallow lines or the site closes.

> Page: https://ui.eneawork.it/blog/robots-txt-guida
> Markdown: https://ui.eneawork.it/blog/robots-txt-guida.md

*2026-11-01*

robots.txt è un file di testo alla radice del dominio che dice ai crawler quali URL non richiedere, e non è un modo per togliere pagine dai risultati. La distinzione sembra teorica finché un gruppo sbagliato non chiude il sito intero.

Il catalogo EneUI conta 111.985 componenti, 1.556 blocchi e 12.808 icone da 1.472 librerie, letti da /api/stats il 1 novembre 2026. Lo stesso giorno abbiamo scaricato https://ui.eneawork.it/robots.txt: 14 gruppi, di cui 13 con un user-agent nominato e uno con *, 3 righe Disallow per gruppo, 1 riga Sitemap e 3 path chiusi: /api/, /preview e /builder/. SeznamBot porta anche Request-rate: 1/10s.

## La sintassi che conta

Un gruppo è un blocco di righe che inizia con User-agent e continua con Allow, Disallow, Crawl-delay o direttive non standard. Il crawler applica il gruppo più specifico che lo nomina. Se quel gruppo esiste, le regole del gruppo * non si sommano: vengono sostituite. Per questo ogni gruppo nominato deve ripetere i Disallow, altrimenti apre ciò che il gruppo generico chiudeva.

User-agent: GPTBot Allow: / Disallow: /api/ Disallow: /preview Disallow: /builder/ User-agent: * Allow: / Disallow: /api/ Disallow: /preview Disallow: /builder/ Sitemap: https://ui.eneawork.it/sitemap.xml

Google riconosce * e $ nei path e confronta il prefisso più lungo, con Allow che vince a parità di lunghezza. Altri motori implementano un sottoinsieme: una regola esotica può essere ignorata, e il file è pubblico, quindi non contiene segreti. La documentazione di Google sul formato, letta il 1 novembre 2026, è la fonte di queste regole.

## Il test che evita il blocco totale

cat > robots.mjs /^User-agent:/m.test(g)); const sitemaps = txt.match(/^Sitemap:\s*\S+/gm) || []; for (const g of groups) { const agent = (g.match(/^User-agent:\s*(.+)$/m) || [])[1]; const closed = (g.match(/^Disallow:\s*\S+/gm) || []).length; console.log(agent, `${closed} disallow`, closed < 3 ? "check" : "ok"); } console.log(`${groups.length} groups, ${sitemaps.length} sitemap lines`); EOF node robots.mjs

Lo script divide il file in gruppi, conta i Disallow e segnala con check ogni gruppo che ne ha meno di tre. Sul sito EneUI stampa 14 gruppi, tutti con tre Disallow, e una riga Sitemap. Il controllo serve dopo ogni modifica al file: un gruppo copiato a metà è il modo più comune di riaprire /api/ senza accorgersene.

## Il catalogo EneUI

Nel nostro file le pagine di contenuto restano aperte: le 111.985 schede sotto /components, i 1.556 blocchi sotto /blocks e le 12.808 icone sotto /icons. È chiuso /api/, con l'eccezione di /api/registry/ per i crawler di risposta come OAI-SearchBot e PerplexityBot. La regola è deliberata: la pagina si scansiona, l'endpoint che costa CPU no. Verificato il 1 novembre 2026.

## La limitazione

Un Disallow non rimuove un URL già indicizzato: Google può continuare a mostrare la pagina con l'anchor text dei link esterni. Per uscire dall'indice serve noindex, che a sua volta richiede accesso al crawl: bloccare la pagina in robots.txt impedisce a Google di leggere il noindex e la lascia in un limbo. Il file viene anche messo in cache, quindi una correzione non è visibile all'istante.

## Dove continuare

La generazione automatica del file in App Router è in sitemap e robots generati in Next.js; la sequenza per entrare nell'indice è in indicizzare un sito su Google; la differenza fra noindex e canonical è in canonical, la guida pratica.

## FAQ

### robots.txt rimuove una pagina da Google?

No. Blocca la richiesta del crawler. La pagina può restare nei risultati, senza contenuto aggiornato. Per togliere un URL dall'indice serve noindex o una richiesta di rimozione.

### Dove va il file?

Alla radice del dominio, su https://example.com/robots.txt. Un file in una sottocartella non viene letto dai crawler per le altre cartelle.

### Allow e Disallow insieme, chi vince?

Vince la regola con il path più lungo. A parità di lunghezza vince Allow. Una regola più specifica batte quella generica, indipendentemente dall'ordine nel file.

### Perché il gruppo con il nome del crawler ignora le regole di *?

Perché il gruppo più specifico sostituisce quello generico. Se nominare un crawler deve mantenere i blocchi del sito, quelle righe vanno ripetute dentro il gruppo nominato.

### Cosa scrivo nella riga Sitemap?

Un URL assoluto, con schema e host, e una riga per ogni sitemap o indice. Un percorso relativo viene ignorato e la sitemap non viene scoperta da quel file.
