Analisi dei log del server per la SEO: guida completa

I log del server sono l'unica fonte di verità su come i bot vedono il sito: pipeline completa, dai log alle azioni su robots.txt e sitemap.

Perché analizzare i file di log

Google Search Console mostra solo dati aggregati con tre giorni di ritardo. Screaming Frog simula un browser, non Googlebot. I file di log del server web sono l'unica fonte che registra ogni richiesta reale di un bot dei motori di ricerca: timestamp esatto, URL, stato della risposta e indirizzo IP del crawler.

Flusso di lavoro dell'analisi dei log del server per l'audit SEO.

L'analisi dei log risponde a domande che non puoi risolvere in altro modo: quali pagine Googlebot scansiona ogni ora e quali non visita da mesi; dove il crawler incontra 404 e 500; se esistono loop infiniti di redirect; se il budget viene sprecato su duplicati parametrici o pagine dietro un login. Sono esattamente i dati che servono per decidere in modo informato la gestione del crawl budget.

Regola pratica: se il tuo sito ha più di 10.000 URL, o se la sezione «Scoperta — attualmente non indicizzata» in GSC continua a crescere, l'analisi dei log è obbligatoria, non facoltativa.

Cosa dà l'analisi dei log

100%

Richieste reali

Ogni richiesta HTTP di un crawler viene catturata nel file di log — niente campionamento, niente ritardi di aggregazione

≤1s

Precisione temporale

Timestamp al secondo per tracciare i pattern di scansione per giorno della settimana e ora del giorno

3+

Bot in un'unica fonte

Googlebot, Bingbot, Yandex e altri — tutti i crawler in un solo file, confrontabili in un'unica vista

0

Ritardo dei dati

I log sono disponibili subito — nessuna attesa di riscansione o aggiornamento dei report GSC

Come accedere ai file di log

Il percorso dei log dipende dal server web e dal provider di hosting. Sulla maggior parte dei VPS e server dedicati i file di log sono accessibili direttamente via SSH. Per l'analisi servono in genere gli access log degli ultimi 30–90 giorni: una finestra abbastanza lunga da rivelare pattern stagionali restando attuale.

Server / piattaformaPercorso log di defaultNote
Nginx/var/log/nginx/access.logRotazione via logrotate. Archivi: access.log.1, access.log.2.gz ecc.
Apache/var/log/apache2/access.log (Debian/Ubuntu) o /var/log/httpd/access_log (RHEL)Il formato può essere CLF o Combined — controlla la direttiva LogFormat
cPanel / WHM~/access-logs/<domain> o File Manager → LogsSpesso suddivisi per dominio. Raw Access disponibile nell'interfaccia cPanel
Cloudflare Workers / EnterpriseLogpush API → S3, R2, GCSSolo piano Enterprise. Per Free/Pro — Workers Analytics Engine
AWS CloudFrontBucket S3 configurato in Distribution settings → LoggingLog ogni 5–10 minuti, compressi gzip
Google Cloud / GCSCloud Logging → export su BigQuery o GCSIdeale per grandi volumi — query SQL direttamente in BigQuery
Esempio di implementazione:
bash
# Nginx: view the last 1000 lines of the access log
tail -n 1000 /var/log/nginx/access.log

# Size of the current log file
du -sh /var/log/nginx/access.log

# Decompress and merge rotated logs
zcat /var/log/nginx/access.log.*.gz | cat - /var/log/nginx/access.log > all_access.log

# Line count (≈ number of requests) in the merged file
wc -l all_access.log
Consiglio sulla rotazione: logrotate di default conserva 7–14 giorni di log. Per l'analisi SEO servono almeno 30. Aumenta rotate 30 in /etc/logrotate.d/nginx in anticipo — i log cancellati non si recuperano.

Struttura del record di log: formato CLF

La maggior parte dei server usa di default il Combined Log Format (CLF) — una versione estesa del Common Log Format. Ecco i campi che contano per l'analisi SEO.

text
# Combined Log Format record (Nginx/Apache)
66.249.66.1 - - [19/May/2026:14:32:01 +0000] "GET /blog/seo-guide/ HTTP/1.1" 200 45231 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
│           │ │  │                              │                          │    │       │   │
│           │ │  │                              │                          │    │       │   └─ User-Agent
│           │ │  │                              │                          │    │       └───── Referer
│           │ │  │                              │                          │    └─────────── Bytes sent
│           │ │  │                              │                          └──────────────── HTTP status
│           │ │  │                              └─────────────────────────────────────────── Request
│           │ │  └────────────────────────────────────────────────────────────────────────── Timestamp
│           │ └───────────────────────────────────────────────────────────────────────────── Auth user
│           └─────────────────────────────────────────────────────────────────────────────── Ident
└─────────────────────────────────────────────────────────────────────────────────────────── IP address
Confronto delle opzioni:
CampoRilevanza SEOCosa guardare
Indirizzo IPAltaRange IP di Googlebot, Bingbot, Yandex — servono a filtrare i crawler reali
TimestampAltaFrequenza di scansione, data dell'ultima visita a URL specifici
Richiesta (metodo + URL)CriticaQuali URL vengono scansionati: pagine utili, duplicati, parametri, percorsi inesistenti
Stato HTTPCritico200 (bene), 301/302 (redirect), 404 (link morti), 500 (errori server)
Byte inviatiMediaDimensione anormalmente piccola — segno di pagina vuota o risposta stub
User-AgentCriticoDistingue Googlebot dagli altri bot e dagli utenti reali

Filtraggio: isolare i crawler

I log grezzi contengono un mix di richieste utente, ping di monitoring, bot spam e crawler dei motori. Per l'analisi SEO devi estrarre solo i robot dei motori. L'approccio più affidabile è filtrare per stringa User-Agent e poi verificare l'IP via DNS.

bash
# Extract all Googlebot requests
grep -i 'googlebot' /var/log/nginx/access.log > googlebot.log

# Extract all SEO crawlers
grep -iE '(googlebot|bingbot|yandex|ahrefsbot|semrushbot|mj12bot)' \
     /var/log/nginx/access.log > all_bots.log

# Count requests by crawler
grep -oiE '(googlebot|bingbot|yandexbot|ahrefsbot|semrushbot)' \
     /var/log/nginx/access.log | sort | uniq -c | sort -rn

# Verify IP via reverse DNS (confirm it's the real Googlebot)
host 66.249.66.1
# Should return: crawl-66-249-66-1.googlebot.com
# Then forward DNS:
host crawl-66-249-66-1.googlebot.com
# Should return the same IP — then it's a legitimate Googlebot
Non fidarti solo dello User-Agent. I bot spam spesso falsificano la stringa Googlebot. Per un filtraggio accurato, verifica gli IP via reverse DNS: il vero Googlebot risolve su *.googlebot.com. Google pubblica i range IP ufficiali tramite l'API Special IP Addresses.

Metriche SEO chiave

Dopo il filtraggio, passa all'analisi. Ecco sei metriche che danno il massimo degli insight per il minimo sforzo.

Metrica 1Frequenza di scansione

Quante volte Googlebot ha visitato uno specifico URL nel periodo. Le pagine con PageRank alto e aggiornamenti frequenti vengono scansionate più spesso. Se una pagina importante è stata visitata una sola volta in 30 giorni, Google la considera di poco valore.

Target: pagine chiave ≥ una volta ogni 3 giorni
Metrica 2Tasso di risposte con errore

Quota di 4xx e 5xx nelle richieste di Googlebot. I 404 sprecano crawl budget. I 500 segnalano problemi sistemici. Un tasso di errore alto riduce la fiducia di Google nel sito.

Benchmark: 4xx < 3%, 5xx < 0,5%
Metrica 3Quota di redirect

Quale frazione delle richieste di Googlebot finisce in 301 o 302. I redirect consumano budget e rallentano la reindicizzazione. Le catene di redirect (A → B → C) sono particolarmente dannose.

Benchmark: 3xx < 10% di tutte le richieste del bot
Metrica 4URL duplicati nei log

Stesso contenuto sotto URL diversi: con e senza www, con e senza slash finale, con parametri UTM. Ogni variante viene scansionata separatamente — una perdita diretta di crawl budget.

Target: un URL canonical per ogni contenuto
Metrica 5Pagine importanti senza scansione

Pagine chiave (categorie, landing, nuovi articoli) che Googlebot non ha mai richiesto in 30 giorni. Indica problemi di link interni o un blocco in robots.txt.

Target: 0 pagine importanti senza scansione in 30 giorni
Metrica 6Pagine indesiderate nella scansione

Pagine che Google sta scansionando ma non dovrebbe: pannelli admin, pagine di sessione, ambienti di test, duplicati parametrici. Sprecano budget e a volte introducono rischi di sicurezza.

Target: 0 URL sensibili nei log Googlebot

Strumenti di analisi

Tre strumenti coprono il 95% dei compiti di analisi dei log: la riga di comando per verifiche rapide, una GUI specializzata per l'analisi profonda, e Python/BigQuery per grandi volumi e automazione.

Bash: analisi rapida senza installazione

bash
# Top 20 URLs Googlebot crawls most often
grep -i 'googlebot' access.log \
  | awk '{print $7}' \
  | sort | uniq -c | sort -rn | head -20

# Response status distribution for Googlebot
grep -i 'googlebot' access.log \
  | awk '{print $9}' \
  | sort | uniq -c | sort -rn

# URLs returning 404 to Googlebot
grep -i 'googlebot' access.log \
  | awk '$9 == 404 {print $7}' \
  | sort | uniq -c | sort -rn | head -50

# Googlebot request count by day
grep -i 'googlebot' access.log \
  | awk '{print $4}' \
  | cut -d: -f1 | tr -d '[' \
  | sort | uniq -c

# Parametric URLs in Googlebot requests
grep -i 'googlebot' access.log \
  | awk '{print $7}' \
  | grep '?' \
  | sort | uniq -c | sort -rn | head -30

Screaming Frog Log File Analyser

Strumento a pagamento (259 $/anno) ma indispensabile per l'analisi regolare. Carica il file di log, lo parsa e costruisce report: segmentazione Bot vs Browser, dashboard degli stati, mappe di calore della scansione per directory e lista delle pagine senza scansione. Supporta Nginx, Apache, IIS, CloudFlare, Fastly e formati CSV personalizzati.

Python: analisi flessibile per file grandi

python
import re
from collections import Counter

LOG_PATTERN = re.compile(
    r'(?P<ip>\S+) \S+ \S+ \[(?P<time>[^\]]+)\] '
    r'"(?P<method>\S+) (?P<url>\S+) \S+" '
    r'(?P<status>\d{3}) (?P<size>\S+) '
    r'"(?P<referer>[^"]*)" "(?P<ua>[^"]*)')

def parse_log(path: str, bot_pattern: str = 'googlebot') -> list[dict]:
    entries = []
    with open(path) as f:
        for line in f:
            m = LOG_PATTERN.match(line)
            if not m:
                continue
            if bot_pattern.lower() not in m.group('ua').lower():
                continue
            entries.append({
                'ip': m.group('ip'),
                'url': m.group('url'),
                'status': int(m.group('status')),
                'ua': m.group('ua'),
            })
    return entries

entries = parse_log('access.log')

# Top 20 URLs by crawl frequency
url_counts = Counter(e['url'] for e in entries)
for url, count in url_counts.most_common(20):
    print(f'{count:>6}  {url}')

# 404 errors
errors = [e['url'] for e in entries if e['status'] == 404]
for url, count in Counter(errors).most_common(20):
    print(f'{count:>6}  404  {url}')
BigQuery per l'enterprise: quando gli access log arrivano a centinaia di GB, il parsing locale è impraticabile. Caricali in BigQuery (GCS → BigQuery → query pianificata) ed esegui SQL. Analizzare 1 TB costa circa 5 $.

Pattern di scansione: cosa cercare

Le metriche grezze non significano nulla senza interpretazione. Ecco pattern specifici da cercare nei log di Googlebot.

Pattern 1: scansionata ma non indicizzata

Googlebot visita una pagina regolarmente, ma in GSC non compare mai come «indicizzata». Cause: meta tag noindex, blocco X-Robots-Tag negli header HTTP, contenuto povero, canonical che punta a un'altra pagina. Confronta la lista degli URL scansionati regolarmente con le pagine indicizzate dall'API GSC — le discrepanze svelano le pagine problematiche.

Pattern 2: crawl storm

Un picco improvviso di richieste di Googlebot in una finestra breve è spesso segno di URL generati all'infinito: facet, URL parametrici di paginazione, token di sessione negli URL. Un crawl storm può esaurire l'intero budget in ore e mettere sotto pressione il server. Traccia le richieste in un istogramma per ora — i picchi anomali si vedono subito.

Pattern 3: nuove pagine ignorate

Una pagina nuova è stata creata tre settimane fa, aggiunta alla sitemap, ma Googlebot mostra zero richieste nei log. Cause: nessun link interno alla pagina, la sitemap non viene riscansionata dal bot, la pagina è troppo profonda nella gerarchia. Verifica i nuovi URL con lo strumento di ispezione GSC e cerca la data di prima comparsa nei log.

Pattern 4: risorse che bloccano il rendering

Googlebot richiede non solo pagine HTML ma anche CSS, JS e immagini. Se le risorse critiche sono bloccate in robots.txt, il bot non può renderizzare la pagina e potrebbe sottovalutarla. Controlla nei log: quale percentuale delle richieste di Googlebot punta a risorse statiche, e se qualche file JS necessario è bloccato.

Problemi comuni e soluzioni

Problema nei logCausa radiceSoluzione
Molti 404 da GooglebotPagine cancellate che hanno ancora link esterni o interni puntati301 alla pagina viva più vicina + rimuovi i link interni rotti
URL parametrici nella scansioneTag UTM, ordinamenti e sessioni non bloccati in robots.txtDisallow in robots.txt + canonical all'URL pulito sulle pagine stesse
Catene di redirect (A→B→C)Redirect accumulati dopo le ristrutturazioniRiduci a un solo salto — aggiorna tutti i link in uscita
Pagine /admin, /staging nei logSezioni di servizio non bloccateDisallow /admin/ in robots.txt + HTTP auth su staging
Risposte 5xx a GooglebotSovraccarico del server nei picchi di traffico o errori backendOttimizza il TTFB, aggiungi cache, configura il rate limiting per i crawler
Pagina importante non scansionataNessun link interno, troppo in profondità nella gerarchia, assente dalla sitemapAggiungi alla sitemap + aggiungi link interni dalle pagine chiave
Duplicati www / non-wwwNessun redirect 301 configurato verso la versione canonical del dominio301 da non-www a www (o viceversa) a livello nginx/Apache
robots.txt blocca JS/CSS necessariDisallow /assets/ o /static/ da templateRimuovi il blocco per le risorse critiche necessarie al rendering
Esempio di implementazione:
bash
# Detect redirect chains in logs
# Step 1: extract all URLs with 301/302 status for Googlebot
grep -i 'googlebot' access.log \
  | awk '$9 ~ /^30[12]$/ {print $7}' | sort -u > redirects.txt

# Step 2: check if any of those URLs are also redirect sources
while read url; do
  if grep -q "GET $url " redirects.txt 2>/dev/null; then
    echo "CHAIN: $url"
  fi
done < redirects.txt

# Find 5xx errors grouped by URL and hour
grep -i 'googlebot' access.log \
  | awk '$9 ~ /^5/ {print $4" "$7}' \
  | cut -d: -f1-2 \
  | sort | uniq -c | sort -rn | head -20

FAQ

In sintesi

L'analisi dei file di log è l'audit SEO più onesto che esista. GSC mostra aggregati, Screaming Frog simula, ma i log catturano ogni decisione reale di Googlebot. La pipeline è lineare: ottieni i log di 30–90 giorni → filtra i crawler per User-Agent con verifica DNS → calcola le sei metriche chiave → incrocia con l'indice GSC → correggi le discrepanze.

Parti con tre comandi Bash: top 20 degli URL scansionati, distribuzione dei codici di stato, top dei 404. In un'ora avrai una lista concreta di azioni: redirect da configurare, URL da bloccare in robots.txt, pagine da aggiungere alla sitemap. È più rapido ed economico di qualsiasi audit a pagamento — i dati sono già sul tuo server.

Con quale frequenza analizzare i file di log?
Almeno ogni trimestre per siti stabili. Dopo cambi importanti — nuova struttura del sito, redesign, pubblicazione massiva di contenuti — fallo subito. Per e-commerce con decine di migliaia di SKU e generazione attiva di URL parametrici — ogni mese. Se GSC mostra un calo anomalo dell'attività di scansione — immediatamente.
Servono i log se il mio sito è piccolo (< 500 pagine)?
Per i siti piccoli di norma basta GSC. Ma se le posizioni sono calate senza causa evidente, o le nuove pagine impiegano molto a comparire nell'indice, i log ti danno la risposta più in fretta di qualsiasi altro strumento. Un'analisi una tantum richiede 30 minuti e vale la pena farla almeno una volta come audit di calibrazione.
Come distinguo il vero Googlebot da un impostore?
Verifica DNS in due passaggi: prima un reverse lookup dell'IP, che deve risolvere su *.googlebot.com o *.google.com. Poi un forward lookup di quell'hostname, che deve restituire lo stesso IP. Servono entrambi: il solo reverse DNS non basta perché chiunque può impostare un record PTR.
La frequenza di scansione influisce direttamente sul posizionamento?
No. La frequenza di scansione è una conseguenza del posizionamento (PageRank, autorevolezza della pagina), non la sua causa. C'è però un legame indiretto: una pagina che Googlebot visita raramente recepisce più lentamente gli aggiornamenti dei contenuti, quindi le modifiche impiegano più tempo a riflettersi nell'indice.
Cosa fare se Googlebot scansiona troppo aggressivamente e sovraccarica il server?
Regola il crawl rate in Google Search Console (Impostazioni → Crawl rate limit). Per sezioni specifiche usa Crawl-delay in robots.txt — ma Google non promette ufficialmente di rispettarlo. Più affidabile: ottimizza TTFB e caching, così il server regge il carico senza dover limitare la scansione.

Check it with SpiderHead

Free and local: run the audit on your own machine.

Try it