Alcuni link in questa pagina sono link di affiliazione: se ti registri tramite questi link, il sito riceve una commissione senza costi aggiuntivi per te. Prezzi e consigli non cambiano.
La domanda è arrivata sotto il nostro articolo sull’analytics, e nell’ordine giusto: robots.txt, Cloudflare, Anubis. Se ne discute come di alternative. Non lo sono. Uno pubblica una preferenza, uno applica una decisione al bordo, uno fa pagare al client la pagina. Scegliere tra loro significa decidere quale di queste tre cose si vuole davvero.
Abbiamo quindici giorni di access log di un sito andato online in ottobre, 9.996 righe, e uno stack Anubis usa e getta su un portatile. Tutto ciò che qui sotto ha un numero viene da una di queste due fonti. Dove non abbiamo numeri nostri, è scritto.
Prima di tutto: chi lo chiede, poi
Prima di scegliere uno strumento, guardate quanto vale il protocollo gentile sul vostro log. Su 9.996 richieste, 334 erano per robots.txt. Ecco chi le ha mandate, a fronte di quanto ciascuno ha preso:
| Crawler | Richieste | Richieste di robots.txt | URL distinti |
|---|---|---|---|
| ClaudeBot | 484 | 78 | 330 |
| Googlebot | 541 | 17 | 333 |
| GoogleOther | 520 | 0 | 327 |
| GPTBot | 391 | 0 | 387 |
| meta-externalagent | 322 | 0 | 315 |
| AhrefsBot | 202 | 21 | 129 |
| bingbot | 164 | 18 | 67 |
| OAI-SearchBot | 108 | 35 | 61 |
| Amazonbot | 96 | 3 | 94 |
| PerplexityBot | 63 | 9 | 21 |
| YandexBot | 49 | 3 | 38 |
| Applebot | 30 | 5 | 22 |
I due zeri in mezzo alla tabella sono la parte interessante, e non significano quello che sembrano a prima vista.
GPTBot non ha richiesto il nostro robots.txt nemmeno una volta su 391 richieste. OAI-SearchBot l’ha richiesto 35 volte - e i due condividono intervalli di IP. Lo stesso in Meta: meta-externalagent, il crawler dei dati di addestramento, non ha mai chiesto il file, mentre facebookexternalhit, che recupera le anteprime dei link, l’ha chiesto otto volte. Google fa uguale: Googlebot 17 volte, GoogleOther nemmeno una, e girano sulla stessa infrastruttura.
La lettura onesta quindi non è «i crawler di addestramento ignorano robots.txt». È che la richiesta avviene altrove nella flotta del fornitore, e il crawler che vedete nel log sta a valle di una cache che non potete osservare. Con una conseguenza pratica: il vostro log non può dire se una regola di robots.txt sia mai stata vista, tanto meno rispettata. L’unico test del funzionamento di una regola è se i percorsi vietati smettono di essere richiesti.
Anthropic qui è l’eccezione nella direzione opposta. 78 richieste su 484 è un controllo di robots.txt ogni sei richieste di contenuto, e le prime due richieste che ClaudeBot ci ha mai fatto sono state /robots.txt e poi /, a un secondo di distanza.
robots.txt: una richiesta, con un sottile strato di diritto dietro
Costa niente. Meccanicamente non fa niente: un percorso vietato viene comunque servito a chiunque lo chieda.
Ciò che è cambiato di recente sono le carte dietro. L’articolo 53(1)(c) del regolamento sull’IA impone ai fornitori di modelli per finalità generali di predisporre una politica per individuare e rispettare le riserve di diritti espresse ai sensi dell’articolo 4(3) della direttiva sul diritto d’autore, «anche mediante tecnologie all’avanguardia». Il codice di buone pratiche allegato nomina una di quelle tecnologie in modo esplicito: i firmatari si impegnano a rispettare robots.txt secondo l’RFC 9309.
Leggete il perimetro prima di contarci. L’obbligo cade sui fornitori di modelli per finalità generali, e il codice è volontario e firmato. Uno scraper che non sia esso stesso fornitore di modelli ne sta fuori, e cosa valga come riserva di diritti efficace è ancora una questione per i tribunali. Le FAQ della Commissione elencano diversi altri meccanismi leggibili dalle macchine accanto a robots.txt.
Il valore pratico è reale ma stretto: un robots.txt con direttive AI esplicite costa poco, ed è l’artefatto da indicare se un giorno serve mostrare che una riserva è stata espressa. Una prova, non un muro.
Cloudflare: applicazione, se il DNS è già lì
Questa è la sezione senza numeri nostri, e preferiamo dirlo piuttosto che travestire la documentazione da misura. Il nostro blog non sta dietro Cloudflare, nulla di quanto segue l’abbiamo misurato noi.
Dalla documentazione di Cloudflare: AI Crawl Control mostra quali servizi AI vi scansionano, permette regole di allow o block per crawler, traccia il rispetto di robots.txt ed espone un’opzione pay per crawl in beta privata. La funzione managed robots.txt genera le direttive dalle politiche scelte e le antepone a quello che il vostro origin già serve. Entrambe sono documentate come disponibili su tutti i piani.
Il punto architetturale: è l’unica delle tre opzioni che blocca una richiesta prima che raggiunga il vostro server, e l’unica in cui l’elenco di chi è chi lo mantiene qualcun altro. Lo scambio è tutto lì. Ottenete applicazione senza gestire niente, e in cambio la decisione su cosa conti come crawler AI la prende una terza parte, davanti al vostro sito, per ogni visitatore.
Anubis: far pagare il client
Anubis è un reverse proxy che mette una prova di proof-of-work davanti all’origin. Nessuna dichiarazione di identità è coinvolta: un client che non riesce a eseguire il JavaScript della prova non ottiene la pagina, qualunque cosa dica il suo user-agent.
Abbiamo messo la v1.28.2 davanti a un origin nginx su un portatile e l’abbiamo sondata. Con la policy di default distribuita:
| Client | Risposta |
|---|---|
curl/8.18.0 | 200, diretto all’origin, 53 byte |
| user-agent GPTBot | pagina di rifiuto, 2.270 byte, servita con HTTP 200 |
| user-agent ClaudeBot | pagina di rifiuto, servita con HTTP 200 |
| user-agent Googlebot | pagina della prova, ~7,1 KB |
| user-agent Chrome desktop | pagina della prova, ~7,1 KB |
Tre cose da sapere prima di metterlo in produzione.
La pagina di rifiuto torna con HTTP 200, non 403. Se monitorate il sito per codice di stato, un crawler completamente bloccato somiglia a uno sano.
Un client non-browser semplice e onesto passa senza ostacoli. È voluto - così continuano a funzionare curl, i lettori di feed e il vostro monitoraggio - ma significa anche che Anubis non è un muro contro lo scraping in generale. Tutto ciò che non finge di essere un browser passa per default.
E la riga Googlebot è un artefatto di laboratorio che vale segnalare: Anubis verifica i motori di ricerca via DNS inverso, e per una richiesta che arriva da 127.0.0.1 non può riuscire. In un deployment reale quella riga sarebbe un passaggio, non una prova. La mostriamo perché è proprio il tipo di risultato che sembra una scoperta e non lo è.
Quanto costa la prova all’umano
È il numero che decide se Anubis si può usare su un sito con visitatori reali. Abbiamo risolto la prova con un Chromium headless misurando dalla navigazione al rendering della pagina di origin:
| Difficoltà | Mediana | Esecuzioni |
|---|---|---|
| 2 (default) | 0,08 s | 5 |
| 4 | 0,27 s | 5 |
| 6 | da 50 a 75 s | 2 su 3 |
Al default distribuito la barriera è invisibile. Due scatti più su è un minuto di pagina che gira, perché ogni livello moltiplica il lavoro per sedici. La terza esecuzione a difficoltà 6 non si è conclusa affatto entro il nostro timeout di 90 s, e questa è la forma onesta della coda: a quell’impostazione il costo non è solo alto, è abbastanza disperso perché una parte dei visitatori rinunci. Se girate quella manopola perché il default «sembra basso», non ve ne accorgerete: il vostro browser tiene il cookie di sblocco per una settimana. Paga ogni visitatore che arriva per la prima volta.
Due trappole di deployment, entrambe più costose della misura stessa.
La variabile d’ambiente DIFFICULTY non cambiava la prova. Nella v1.28.2 il log di avvio la riporta, la prova servita la ignora, e il numero che conta viene dal file di policy. L’abbiamo colto solo leggendo la difficoltà dal JSON incorporato nella pagina della prova.
Senza USE_REMOTE_ADDRESS=true, ogni singola richiesta restituiva HTTP 500, con [misconfiguration] X-Real-IP header is not set nel log. Anubis presume che qualcosa davanti a lui imposti quell’header. Se nessuno lo fa, si chiude su tutto il traffico, non solo sui bot.
Si può davvero dire chi è chi
Tutti tre gli approcci alla fine poggiano sull’identificazione, quindi abbiamo controllato quanto funziona oggi. Ogni richiesta di crawler dal nostro log, confrontata con l’elenco pubblicato dal fornitore o con il DNS inverso:
| Crawler | Richieste | Verificate | Contro |
|---|---|---|---|
| ClaudeBot | 484 | 484 / 484 | claude.com/crawling/bots.json |
| GPTBot | 391 | 391 / 391 | openai.com/gptbot.json |
| OAI-SearchBot | 108 | 108 / 108 | openai.com/searchbot.json |
| PerplexityBot | 63 | 63 / 63 | perplexity.ai/perplexitybot.json |
| ChatGPT-User | 39 | 37 / 39 | openai.com/chatgpt-user.json |
| Googlebot | 541 | 541 / 541 | DNS inverso |
| GoogleOther | 520 | 520 / 520 | DNS inverso |
| bingbot | 164 | 164 / 164 | DNS inverso |
| Amazonbot | 96 | 96 / 96 | DNS inverso |
| YandexBot | 49 | 49 / 49 | DNS inverso |
| Applebot | 30 | 30 / 30 | DNS inverso |
| meta-externalagent | 322 | 322 / 322 | prefissi annunciati AS32934 |
Meglio di quanto suggerisca il folklore. I grandi crawler AI ora pubblicano elenchi di IP che si possono scaricare e controllare, e i nostri corrispondevano richiesta per richiesta.
Due eccezioni. ChatGPT-User ha inviato due richieste da indirizzi fuori dall’elenco pubblicato: è l’unico agente attivato da una persona nella tabella, e quello in cui uno scostamento preoccupa meno. E meta-externalagent non ha né DNS inverso né un elenco di crawler pubblicato che abbiamo trovato, quindi l’unico controllo disponibile è se l’indirizzo stia nei prefissi di rete annunciati da Meta. È un’affermazione molto più debole: dice che il pacchetto è arrivato dalla rete di quell’azienda, non che il crawler sia quello che dichiara.
Il passo, quando l’identità non è disponibile
Per tutto ciò che non si verifica né si identifica, il comportamento lo tradisce comunque. L’intervallo tra richieste consecutive dello stesso crawler, su quindici giorni:
| Crawler | Intervallo mediano | Quota di intervalli sotto 1 s |
|---|---|---|
| GPTBot | 1 s | 92,1% |
| meta-externalagent | 1 s | 88,2% |
| YandexBot | 1 s | 75,0% |
| ClaudeBot | 1 s | 52,0% |
| AhrefsBot | 29 s | 31,8% |
| Googlebot | 158 s | 8,0% |
| GoogleOther | 137 s | 0,8% |
La separazione è netta, e non è questione di cortesia. Google ha prelevato più pagine di tutti (541 e 520 URL) e l’ha fatto con un intervallo mediano di oltre due minuti, perché il ritmo di scansione è un problema risolto su cui ha avuto decenni. I crawler di addestramento hanno preso il sito in una passata, veloci quanto il sito serviva.
L’uso pratico: su un sito tranquillo, un istogramma degli intervalli di arrivo separa una scansione da un pubblico senza leggere un solo user-agent. Un picco concentrato in un unico intervallo sotto il secondo è una macchina. Gli umani producono raffiche serrate - ripristino di schede, prefetch - ma non le tengono per 390 richieste.
Quindi cosa scegliere
| Se volete | Usate | Prezzo |
|---|---|---|
| Dichiarare una preferenza e avere l’artefatto agli atti | robots.txt con direttive AI esplicite | Niente |
| Fermare le richieste prima che il server le veda, senza gestire nulla | Cloudflare AI Crawl Control | Il DNS passa da loro, e il loro elenco definisce chi è bot |
| Rendere il contenuto indisponibile a tutto ciò che non esegue un browser | Anubis davanti all’origin | Una barriera che attraversa anche ogni umano al primo arrivo |
| Sapere cosa succede davvero | Il vostro access log, analizzato | Un pomeriggio, una volta sola |
Si impilano, e quella è la configurazione sensata: robots.txt dice cosa volete, uno degli altri due applica la parte che vi interessa abbastanza da applicare, e il log dice se qualcosa ha funzionato.
Cosa gira su questo sito: robots.txt, e nient’altro. Pubblichiamo articoli perché siano letti, anche da ciò che poi li riassume. Lo stack Anubis l’abbiamo costruito proprio per poter mettere un numero sull’alternativa, e il numero dice che lo strumento va bene e che il pericolo è la manopola della difficoltà.
Cosa questo non può dire
Un sito, una nicchia, una finestra di quindici giorni, 9.996 richieste. Un sito con contenuto commerciale reale attira un’altra classe di scraper, quella che non si annuncia e non compare in nessuna di queste tabelle, e contro quella popolazione ogni numero qui sopra è irrilevante.
Le misure di Anubis vengono da un portatile contro localhost: nessuna latenza di rete, un client, e una CPU più veloce del telefono mediano. Prendete la curva di difficoltà come la forma del costo, non come il suo valore assoluto.
E il buco che con i log non si chiude affatto: richiedere robots.txt non è rispettarlo, e non richiederlo non è ignorarlo. Tutto nella prima tabella è una misura di richieste, non di consenso.