Reindirizzamenti JavaScript
Cos'è un reindirizzamento JavaScript, come la pipeline di rendering di Google lo tratta diversamente da un 301 lato server, quando è un'ultima risorsa accettabile, e come implementarlo e rilevarlo — oltre a dove si collocano il meta refresh e l'History API.
Lingue
1 segnale di evidenza in questa pagina
- Strumento live correlatorobots.txt Tester
Un reindirizzamento JavaScript invia utenti e crawler a un nuovo URL con codice lato client (window.location.replace() o .href). È il tipo di reindirizzamento meno affidabile perché Google lo vede solo dopo il rendering — che può essere ritardato o fallire del tutto, senza una tempistica fissa in entrambi i casi. L'ordine di preferenza ufficiale di Google è lato server (301/302/307/308) → meta refresh → JavaScript, e la sua documentazione dice chiaramente: usa i reindirizzamenti JS solo se non puoi fare gli altri due. Una volta che Google lo interpreta con successo, la destinazione diventa un segnale di canonicalizzazione — ma non è una garanzia provata di identico PageRank o risultati di ranking rispetto a un 301, quindi trattalo come ultima risorsa piuttosto che come una sostituzione equivalente. Usali su piattaforme limitate senza accesso al server, per pagine di errore SPA che puntano a un vero 404, e poco altro. Se devi usarne uno, usa window.location.replace() nel <head>, rimuovi l'URL sorgente dalla tua sitemap e punta i link interni alla destinazione finale. Il meta refresh è un reindirizzamento separato a livello HTML, e history.pushState()/replaceState() non sono affatto reindirizzamenti.
TL;DR — Un redirect JavaScript usa il codice della pagina per inviare l’utente a un URL diverso dopo il caricamento. Per le persone funziona, ma i motori di ricerca lo gestiscono in modo meno affidabile di un redirect lato server (un 301). Se puoi configurare un 301, fallo. Usa i redirect JavaScript soltanto quando non hai alternative.
Cos’è un redirect JavaScript
Un redirect JavaScript cambia la navigazione tramite l’esecuzione di script piuttosto che una risposta HTTP 3xx. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: Google: JavaScript redirects Google può elaborare i redirect JavaScript ma consiglia redirect lato server quando possibile. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: Google: Redirects and Search
Ci sono due modi principali per inviare qualcuno da un URL a un altro.
Il primo è un redirect lato server. Prima ancora che la pagina venga caricata, il server dice “quella pagina è stata spostata — vai qui invece” usando un codice di stato come 301 (permanente) o 302 (temporaneo). Il browser e il motore di ricerca ricevono entrambi quel messaggio immediatamente.
Il secondo è un redirect JavaScript. La pagina si carica normalmente, poi uno script viene eseguito nel browser e porta l’utente altrove. Per esempio:
<script>
window.location.replace("https://example.com/new-page/");
</script>Per chi naviga nel sito, i due metodi sembrano quasi identici. Per un motore di ricerca, invece, sono molto diversi: è proprio questa differenza il motivo per cui esiste questa pagina.
Perché i motori di ricerca li trattano in modo diverso
Google legge la pagina in più fasi. Prima ne esegue la scansione (scaricando l’HTML grezzo). In seguito esegue il rendering, cioè avvia il JavaScript come farebbe un browser. Un 301 lato server è visibile già nella prima fase. Un redirect JavaScript compare soltanto durante il rendering, che può avvenire molto più tardi o, in alcuni casi, non riuscire affatto.
Google lo dice direttamente: “Only use JavaScript redirects if you can’t do server-side or meta refresh redirects.” (traduzione) «Usa i redirect JavaScript solo se non puoi fare redirect lato server o meta refresh.» (Google Search Central)
Un redirect JavaScript, quindi, non è necessariamente sbagliato: è semplicemente meno affidabile. Google di solito finisce per rilevarlo, ma un vero 301 è più rapido e offre maggiori certezze.
La regola semplice
- Puoi impostare un 301 (o 302)? Fallo: è la soluzione di riferimento.
- Non puoi toccare il server, ma puoi modificare l’HTML
<head>? Un meta refresh a 0 secondi è l’opzione immediatamente successiva. - Nessuno dei due? Allora un redirect JavaScript è un’ultima risorsa accettabile.
Due errori comuni:
- Un meta refresh non è un redirect JavaScript. È un tag
<meta>nel tuo HTML, e Google lo gestisce prima e in modo più affidabile di JS. history.pushState()non è un redirect. Modifica soltanto la barra degli indirizzi: non porta l’utente altrove e i motori di ricerca non lo seguono come redirect.
Vuoi i tempi della pipeline di rendering, i dettagli di implementazione e come trovare i redirect JS in un crawl? Passa alla scheda Avanzate.
TL;DR — Un redirect JavaScript è un redirect lato client (
window.location.replace(),.href,.assign()) che Google elabora solo dopo il rendering — fase tre di crawl → render → index. Un 301 lato server viene visto al momento del crawl; un redirect JS aspetta nella coda di rendering, e Google non fornisce una tempistica fissa per quell’attesa — può essere rapida o può richiedere molto tempo, e il rendering può fallire del tutto. L’ordine di preferenza documentato da Google è server-side → meta refresh → JavaScript, e la documentazione dice di usare i redirect JS solo quando non puoi fare le altre due cose. Una volta che Google li interpreta con successo, la destinazione diventa un segnale di canonicalizzazione permanente — persino Google li ha usati sul proprio blog quando nient’altro funzionava — ma questa non è una prova documentata di risultati identici in termini di PageRank o ranking rispetto a un 301, quindi sono un’ultima risorsa, non un segnale di spam. Gli usi legittimi sono piattaforme vincolate senza configurazione server e pagine di errore SPA che puntano a un vero 404. Implementa conwindow.location.replace()nel<head>, rimuovi la sorgente dalla tua sitemap, riorienta i link interni e conferma che Googlebot possa recuperare il JS. Il meta refresh è a livello HTML (0s = permanente, qualsiasi ritardo = temporaneo), ehistory.pushState()/replaceState()non sono affatto redirect.
Cosa conta come redirect JavaScript
La navigazione tramite script dipende dal rendering e dall’esecuzione, quindi non è equivalente a livello di protocollo ad un redirect HTTP. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: Google: JavaScript redirects L’elaborazione è possibile, non una garanzia di tempi esatti o di indicizzazione. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: Google: Redirects and Search
Un redirect JavaScript naviga il browser verso un nuovo URL con codice lato client. I metodi comuni e come differiscono:
window.location.replace("url")— naviga e rimuove l’URL originale dalla cronologia della sessione. Questo è quello da usare: il pulsante indietro salta la sorgente del redirect invece di rimandare l’utente direttamente indietro.window.location.href = "url"— naviga ma mantiene l’originale nella cronologia, quindi il pulsante indietro torna alla pagina che reindirizza (e può creare un loop).document.location.hrefewindow.location.assign("url")si comportano allo stesso modo.history.pushState()/history.replaceState()— non sono redirect. Riscrivono la barra degli indirizzi senza alcuna navigazione o segnale HTTP, quindi i crawler non li trattano come redirect. Le SPA li usano per cambi di URL in-app; hanno bisogno di veri link<a href>(o navigazioni reali) per essere indicizzabili.
La linea di demarcazione che conta: .replace(), .href e .assign() attivano tutti
una vera navigazione del documento (la differenza tra loro è solo ciò che accade alla
cronologia della sessione), mentre pushState()/replaceState() non navigano mai —
toccano lo stato della cronologia e la barra degli indirizzi e nient’altro. Nessuno dei quattro è
un HTTP 301; “redirect” qui è un’abbreviazione per navigazione lato client, non un codice di stato.
Il meta refresh (<meta http-equiv="refresh" content="0;url=...">) è spesso
raggruppato con i redirect JS, ma è una direttiva HTML analizzata prima che JavaScript
venga eseguito — una categoria separata e più affidabile, trattata di seguito.
Come Google elabora un redirect JavaScript
Questo è il punto cruciale. La pipeline di Google funziona a fasi, e un redirect JS e un redirect lato server vengono intercettati in fasi diverse:
- Scansione — Googlebot recupera l’URL e legge l’HTML grezzo. Un 301/302/307/308 lato server viene rilevato in questa fase.
- Coda di rendering — le pagine che restituiscono
200aspettano di essere renderizzate. La documentazione di Google nota che la pagina “may stay on this queue for a few seconds, but it can take longer than that.” (traduzione) «può rimanere in questa coda per alcuni secondi, ma l’attesa può essere più lunga.» Google non pubblica una tempistica di servizio fissa oltre a questo, quindi tratta l’attesa come imprevedibile — può essere rapida, o può trascinarsi — piuttosto che assumere un numero specifico di giorni o settimane. - Rendering e indicizzazione — Chromium headless esegue il JavaScript. Questo è il primo momento in cui un redirect JS esiste per quanto riguarda Google.
La stessa idea che presento in Crawling e in JavaScript SEO vale anche qui: il rendering è un passaggio separato dal fetching, e tutto ciò che dipende da esso eredita quel ritardo e quel rischio.
E il rischio è reale. Google: “While Google attempts to render every URL Googlebot crawled, rendering may fail for various reasons. This means that if you set a JavaScript redirect, Google might never see it if rendering of the content failed.” (traduzione) «Sebbene Google tenti di eseguire il rendering di ogni URL che Googlebot ha scansionato, il rendering potrebbe fallire per vari motivi. Ciò significa che se imposti un reindirizzamento JavaScript, Google potrebbe non vederlo mai se il rendering del contenuto fallisce.» (Google Search Central) Durante la finestra prima che il reindirizzamento venga elaborato — e per sempre, se il rendering fallisce — Google potrebbe mantenere la pagina sorgente vuota nel suo indice.
L’ordine di preferenza ufficiale di Google
La documentazione sui reindirizzamenti delinea una gerarchia dal più al meno affidabile:
- Reindirizzamenti lato server — 301/308 (permanenti), 302/307 (temporanei). I migliori per tutto: visti al momento della scansione, senza ambiguità.
- Meta refresh — a livello HTML. Un meta refresh a 0 secondi viene trattato come un reindirizzamento permanente (come un 301); qualsiasi meta refresh ritardato viene trattato come temporaneo.
- Reindirizzamenti JavaScript — ultima risorsa.
Le parole di Google: “Only use JavaScript redirects if you can’t do server-side or meta refresh redirects.” (traduzione) «Usa i redirect JavaScript soltanto se non puoi usare redirect lato server o meta refresh.» I reindirizzamenti permanenti trasmettono il segnale canonico alla destinazione; quelli temporanei mantengono l’originale nei risultati. (Come questo interagisce con la selezione canonica è trattato in Canonicalizzazione.)
Il link equity viene trasmesso?
La documentazione ufficiale di Google sui reindirizzamenti elenca la navigazione tramite JavaScript tra i suoi metodi di reindirizzamento permanente e afferma che la destinazione diventa il segnale di canonicalizzazione una volta che Google l’ha interpretata — quindi l’affermazione “JS redirects don’t pass PageRank” (traduzione) «i redirect JS non trasmettono PageRank» è falsa. Ciò che la documentazione non stabilisce è che il risultato sia identico, immediato o affidabile quanto un 301 lato server — descrive il segnale canonico, non una garanzia di un flusso di PageRank, posizionamento o tempistiche equivalenti. L’inquadramento onesto: un 301 trasmette il segnale al momento della scansione con quasi certezza; un reindirizzamento JS lo trasmette solo se e quando il rendering riesce, e Google non promette che il risultato corrisponderà uno a uno a quello di un 301. Quel divario — non l’equity persa — è il costo reale della scelta di JavaScript.
Questo è anche il motivo per cui i reindirizzamenti JS non sono di per sé un fattore di penalizzazione. Diventano un problema di spam solo quando vengono usati per il cloaking — mostrare ai crawler una pagina e reindirizzare gli utenti a qualcosa di diverso, o inviare gli utenti mobile a un dominio non correlato. La policy di Google sui reindirizzamenti ingannevoli riguarda quell’intento, non la tecnica.
Quando un reindirizzamento JavaScript è lo strumento giusto
Ci sono casi legittimi:
- Piattaforme vincolate. Alcune configurazioni di hosting condiviso, CDN o CMS non ti danno accesso alle regole di reindirizzamento lato server. Un reindirizzamento JS è un fallback valido — e notevolmente, Google ha usato reindirizzamenti JS sul proprio blog Webmaster perché, come ha detto Gary Illyes, “that was the only thing we could use for 1:1 redirects, and it works on Google” (traduzione) «quella era l’unica cosa che potevamo usare per reindirizzamenti 1:1, e funziona su Google» (OnCrawl).
- Gestione degli errori nelle SPA. Google lo approva esplicitamente: “Use a JavaScript
redirect to a URL for which the server responds with a
404HTTP status code.” (traduzione) «Usa un reindirizzamento JavaScript verso un URL per cui il server risponde con un codice di stato HTTP404.» (Google Search Central) Un’app a pagina singola che risolve una rotta non valida può reindirizzare a un endpoint 404 reale così Google elabora l’errore correttamente invece di indicizzare un soft 404.
Per le migrazioni URL permanenti, questo non è lo strumento giusto — usa un 301. Faccio lo stesso punto in migrazioni di siti: i reindirizzamenti JavaScript sono un’ ultima risorsa e Google potrebbe non vederli mai.
Generatori di siti statici: la trappola degli alias di Hugo
Una sorpresa comune: il frontmatter aliases: di Hugo ha storicamente generato
pagine HTML con meta refresh, non redirect permanenti lato server — e altri generatori statici
hanno fatto cose simili per impostazione predefinita. Le impostazioni predefinite dei generatori cambiano tra le versioni,
quindi controlla l’output effettivo della tua versione attualmente distribuita piuttosto che assumere; se
aliases: non produce redirect lato server, hai bisogno di regole di reindirizzamento a livello di piattaforma (Netlify
_redirects, Cloudflare Workers, Vercel vercel.json) più (su Hugo)
disableAliases: true. Tratto questo in dettaglio in
Hugo SEO.
Best practice di implementazione
Se un reindirizzamento JavaScript è davvero la tua unica opzione:
- Usa
window.location.replace(), non.href. Come dice Search Engine Journal, “JavaScript redirects typically usewindow.location.replace()function rather thanwindow.location.hrefto avoid UX redirect loops.” (traduzione) «I redirect JavaScript usano in genere la funzionewindow.location.replace()invece diwindow.location.href, per evitare cicli nell’esperienza di navigazione.» (SEJ). - Mettilo nel
<head>, non nel<body>. I browser analizzano HTML in sequenza ed eseguono gli script quando li incontrano, quindi “position JavaScript redirects in the<head>tag rather than<body>to minimize delay” (traduzione) «posiziona i redirect JavaScript nel tag<head>anziché nel<body>, per ridurre al minimo il ritardo» (OnCrawl). - Reindirizza alla destinazione finale in un unico salto. Un reindirizzamento JS verso una pagina che a sua volta reindirizza altrove crea una catena; le catene sprecano budget di scansione e possono apparire in GSC come un errore di reindirizzamento.
- Rimuovi l’URL sorgente dalla tua sitemap XML. Le sitemap dovrebbero elencare URL canonici, indicizzabili — non quelli che reindirizzano.
- Ripunta i link interni verso la destinazione, così non passano attraverso il reindirizzamento.
- Assicurati che Googlebot possa recuperare il JS. Se il reindirizzamento vive in uno script esterno
bloccato da
robots.txt, Google non può renderizzarlo e non vedrà il reindirizzamento.
Come rilevare i reindirizzamenti JavaScript
Non si annunciano come un 301 in un header, quindi devi renderizzare:
- Un crawler con rendering JS attivo. OnCrawl raccomanda di eseguire la scansione con
“rendering JavaScript abilitato (timeout minimo di 5 secondi)”; Screaming Frog e
Ahrefs Site Audit possono entrambi renderizzare. Senza rendering, una pagina con reindirizzamento JS sembra
solo un normale
200. - Chrome DevTools. La scheda Network (con “Preserve log”) mostra la navigazione lato client; l’estensione Redirect Path lo segnala anche.
- In Search Console, un reindirizzamento JS elaborato con successo appare sotto Pagina con reindirizzamento — lo stesso stato di qualsiasi URL reindirizzato, che è normale per fonti non canoniche. Tuttavia, quell’etichetta non è garantita in ogni controllo: riflette ciò che Google ha recuperato, renderizzato, interpretato e canonizzato nel momento campionato, quindi un URL può mostrare uno stato diverso (o nessuno stato di reindirizzamento ancora) tra i controlli senza che sia un errore da parte tua.
Cosa farei davvero
Lato server prima di tutto, ogni volta. Meta refresh (0 secondi) quando puoi modificare l’HTML ma non
la configurazione del server. JavaScript solo quando entrambi non sono disponibili — e poi con
window.location.replace() nel <head>, una sitemap pulita e un controllo che il
reindirizzamento si renderizzi effettivamente per Googlebot. Per qualsiasi cosa permanente o di alto valore,
l’affidabilità extra di un 301 vale quasi qualsiasi sforzo per ottenerlo.
Riepilogo AI
Una sintesi della versione Advanced:
- Un redirect JavaScript opera lato client (
window.location.replace(),.href,.assign()). Viene elaborato soltanto dopo il rendering — terza fase della sequenza scansione → rendering → indicizzazione — mentre un 301 lato server viene rilevato durante la scansione. - La coda di rendering è il rischio: una pagina “may stay on this queue for a few seconds, but it can take longer,” (traduzione) «può rimanere in questa coda per alcuni secondi, ma l’attesa può essere più lunga», senza tempi di servizio fissi; inoltre, il rendering può fallire completamente, nel qual caso Google potrebbe non vedere mai il redirect e mantiene la pagina sorgente indicizzata.
- L’ordine di preferenza di Google: lato server (301/302/307/308) → meta refresh → JavaScript. La documentazione raccomanda JavaScript soltanto quando le prime due opzioni non sono disponibili.
- La destinazione diventa un segnale di canonicalizzazione una volta che Google interpreta un redirect JS — quindi il mito “i redirect JS non passano PageRank” è falso — ma Google non documenta che il risultato corrisponda esattamente al flusso di PageRank, al ranking o ai tempi di un redirect lato server. I redirect JS non sono un trigger di penalità a meno che non vengano usati per cloaking (redirect ingannevoli).
- Usi legittimi: piattaforme vincolate (Google stesso li ha usati sul proprio blog), e pagine di errore SPA che reindirizzano a un vero 404 (approvato da Google).
- Meta refresh ≠ redirect JS: è a livello HTML; 0s = permanente, qualsiasi ritardo =
temporaneo.
history.pushState()/replaceState()non sono redirect — nessun segnale HTTP, i crawler non li seguono. - Gli
aliases:di Hugo possono produrre meta refresh anziché redirect lato server — una trappola comune nei generatori statici; verifica l’output della versione distribuita. - Implementazione:
window.location.replace()nel<head>, un singolo salto verso la destinazione, rimuovi la sorgente dalla sitemap, riorienta i link interni, assicurati che Googlebot possa recuperare il JS. - Rilevamento: esegui una scansione con il rendering JavaScript attivo e controlla la navigazione nel browser. In GSC, verifica se l’URL compare con lo stato “Page with redirect”.
Documentazione ufficiale
Guida di fonti primarie su redirect e JavaScript.
- Redirect e Ricerca Google — la gerarchia di preferenza (lato server → meta refresh → JavaScript), la gestione di permanente vs. temporaneo e le regole sul ritardo del meta refresh.
- Nozioni di base su SEO JavaScript — la pipeline di rendering e il caso d’uso approvato del redirect SPA-404.
- Risolvi i problemi JavaScript legati alla ricerca — soft 404, rendering e debug di JS che Google non può elaborare.
- Redirect ingannevoli (criteri per lo spam) — quando un redirect diventa cloaking e una violazione dei criteri.
Bing / Microsoft
- Guida per i webmaster di Bing — punto di ingresso per le attuali linee guida di Bing. (Al momento della scrittura, Bing non aveva una pagina di aiuto dedicata ai redirect a un URL stabile; Bingbot rende JavaScript in modo meno affidabile di Googlebot, il che rende i redirect solo JS più rischiosi per l’indicizzazione di Bing.)
Citazioni dalla fonte
Dichiarazioni ufficiali di Google e delle persone che lavorano alla Ricerca. Ogni link alla documentazione di Google porta direttamente al passaggio citato.
Google — l’ordine di preferenza e il rischio di rendering
- “Only use JavaScript redirects if you can’t do server-side or meta refresh redirects.” (traduzione) «Usa i redirect JavaScript solo se non puoi fare redirect lato server o meta refresh.» — Documentazione di Google Search Central. Vai alla citazione
- “While Google attempts to render every URL Googlebot crawled, rendering may fail for various reasons. This means that if you set a JavaScript redirect, Google might never see it if rendering of the content failed.” (traduzione) «Mentre Google tenta di rendere ogni URL che Googlebot ha scansionato, il rendering potrebbe fallire per vari motivi. Ciò significa che se imposti un redirect JavaScript, Google potrebbe non vederlo mai se il rendering del contenuto fallisce.» — Documentazione di Google Search Central. Vai alla citazione
Google — il caso d’uso SPA approvato
- “Use a JavaScript redirect to a URL for which the server responds with a
404HTTP status code (for example/not-found).” (traduzione) «Usa un reindirizzamento JavaScript verso un URL per cui il server risponde con un codice di stato HTTP404(ad esempio/not-found).» — Documentazione di Google Search Central. Vai alla citazione
Gary Illyes, Google
- Sui reindirizzamenti JS in generale: “Js redirects are probably not a good idea though.” (traduzione) «I reindirizzamenti JS probabilmente non sono una buona idea.» (8 luglio 2020)
- Sul fatto che Google li usi comunque quando nient’altro ha funzionato: “We used JS redirects on webmasters.googleblog.com because that was the only thing we could use for 1:1 redirects, and it works on Google.” (traduzione) «Abbiamo usato reindirizzamenti JS su webmasters.googleblog.com perché era l’unica cosa che potevamo usare per reindirizzamenti 1:1, e funziona su Google.» Copertura
Search Engine Journal — implementazione ed equità dei link
- “JavaScript redirects typically use
window.location.replace()function rather thanwindow.location.hrefto avoid UX redirect loops.” (traduzione) «I redirect JavaScript usano in genere la funzionewindow.location.replace()anzichéwindow.location.href, per evitare cicli con il pulsante Indietro.» Leggi - “JavaScript redirects are not SEO-friendly and should be avoided when alternatives exist… Only implement JavaScript redirects when server-side alternatives are genuinely unavailable.” (traduzione) «I redirect JavaScript non sono una soluzione SEO consigliabile e vanno evitati quando esistono alternative… Implementali soltanto quando le alternative lato server non sono realmente disponibili.» Leggi
Tipi di redirect — scheda rapida
Quando Google lo vede e come viene trattato
| Metodo | Quando Google lo vede | Trattato come | Affidabilità |
|---|---|---|---|
Lato server 301 / 308 | Tempo di scansione | Permanente | Massima |
Lato server 302 / 307 | Tempo di scansione | Temporaneo | Massima |
Meta refresh, 0 secondi | Durante l’analisi dell’HTML | Permanente | Alta |
Meta refresh, ritardato (>0s) | Durante l’analisi dell’HTML | Temporaneo | Alta |
| Reindirizzamento JavaScript | Dopo il rendering | Navigazione seguita | Minima |
history.pushState() / replaceState() | — | Non è un reindirizzamento | n/d |
Metodi di reindirizzamento JavaScript
| Codice | Comportamento nella cronologia | Usarlo? |
|---|---|---|
window.location.replace("url") | Rimuove la sorgente dalla cronologia | Sì — raccomandato |
window.location.href = "url" | Mantiene la sorgente (loop del pulsante indietro) | Evita per i reindirizzamenti |
window.location.assign("url") | Come .href | Evita per i reindirizzamenti |
document.location.href = "url" | Alias per .href | Evita per i reindirizzamenti |
Fatti rapidi
- L’ordine di Google: lato server → meta refresh → JavaScript. Usa JS solo quando i primi due sono impossibili.
- Una volta interpretato, la destinazione di un reindirizzamento JS è un segnale di canonicalizzazione — il mito “i reindirizzamenti JS non passano PageRank” è falso. Google non documenta quel risultato come identico a quello di un 301, quindi il rischio reale è il ritardo / il fallimento del rendering, non una penalità PageRank documentata.
- I reindirizzamenti JS non sono una penalità a meno che non vengano usati per cloaking.
- Hugo
aliases:= meta refresh, non 301. - Un reindirizzamento JS elaborato appare come “Pagina con reindirizzamento” in GSC.
Dovrei usare un reindirizzamento JavaScript? — lista di controllo decisionale
Percorri questa lista dall’alto verso il basso; fermati al primo “sì”.
- Posso impostare un
301/302/307/308lato server? → Fallo. Fermati qui. - Posso modificare il
<head>HTML ma non la configurazione del server? → Usa un meta refresh a 0 secondi per spostamenti permanenti. Fermati qui. - Nessuno dei due è possibile (piattaforma bloccata), o è una pagina di errore SPA che dovrebbe restituire un vero 404? → Un reindirizzamento JavaScript è accettabile. Continua.
Se stai usando un reindirizzamento JavaScript
- Usa
window.location.replace()(non.href/.assign()). - Posiziona lo script nel
<head>, il prima possibile. - Reindirizza direttamente alla destinazione finale — nessuna catena attraverso un altro reindirizzamento.
- Rimuovi l’URL sorgente dalla tua sitemap XML.
- Ripunta i link interni alla destinazione.
- Conferma che il JS del reindirizzamento non sia bloccato in
robots.txtcosì che Googlebot possa renderizzarlo. - Non stai mostrando ai crawler una pagina e reindirizzando gli utenti altrove (cloaking).
- Verifica eseguendo il crawl con il rendering JS attivo e controllando “Page with redirect” in GSC.
Il reindirizzamento JavaScript consigliato
Metti questo nel <head> così che venga eseguito il prima possibile nell’ordine di parsing:
<head>
<script>
window.location.replace("https://example.com/new-page/");
</script>
</head>replace() è la scelta chiave — rimuove l’URL di reindirizzamento dalla cronologia della sessione,
così il pulsante indietro non rimbalza l’utente direttamente nel reindirizzamento.
Il meta refresh a 0 secondi (seconda scelta quando non puoi fare lato server)
Non è JavaScript, ma è il fallback giusto quando puoi modificare l’HTML e non la configurazione del server. Un ritardo di 0 secondi è trattato da Google come un reindirizzamento permanente:
<head>
<meta http-equiv="refresh" content="0; url=https://example.com/new-page/">
</head>Cosa NON usare come reindirizzamento
history.pushState() riscrive la barra degli indirizzi ma non esegue alcuna navigazione e
non invia alcun segnale HTTP — i crawler non lo seguiranno:
// NOT a redirect — only changes the URL bar, no navigation happens
history.pushState({}, "", "/new-page/");Se hai bisogno che un cambio di rotta SPA sia indicizzabile, fornisci un vero link <a href> o una
navigazione genuina, non solo una chiamata all’API History.
Pagina di errore SPA → vero 404 (pattern approvato da Google)
Quando un’app a pagina singola risolve una rotta sconosciuta, inviala a un endpoint che
restituisce un vero 404 così che Google elabori l’errore invece di un soft 404:
// On an unresolved route in your SPA:
window.location.href = "/not-found"; // /not-found must return HTTP 404 Strumenti per trovare e controllare i reindirizzamenti JavaScript
- Per una scansione completa, configura il crawler Screaming Frog affinché esegua il rendering
JavaScript e conceda alla pagina un tempo di attesa sufficiente. La verifica deve confermare che il
browser simulato raggiunga davvero la destinazione prevista, anziché registrare soltanto la risposta
iniziale
200e lasciare invisibile il successivo spostamento lato client. - In Ahrefs Site Audit, attiva il rendering delle pagine per individuare redirect, catene e link interni che attraversano un reindirizzamento.
- Nel pannello Rete di Chrome DevTools, attiva “Preserve log” e osserva l’avvio della navigazione lato client.
- L’estensione per Chrome Redirect Path segnala rapidamente i redirect lato client insieme a quelli lato server.
- In Google Search Console, usa Controllo URL per verificare come un singolo URL è stato scansionato e renderizzato e se Google mostra lo stato “Page with redirect.” (traduzione) «Pagina con reindirizzamento».
- Nel rapporto Indicizzazione delle pagine di GSC, lo stato “Page with redirect” (traduzione) «Pagina con reindirizzamento» raccoglie gli URL reindirizzati, mentre “Redirect error” (traduzione) «Errore di reindirizzamento» segnala catene e cicli.
Errori da evitare con i reindirizzamenti JavaScript
- Usare
window.location.href(o.assign()) invece di.replace()..hrefmantiene la pagina di reindirizzamento nella cronologia della sessione, quindi il pulsante Indietro riporta l’utente direttamente al reindirizzamento — un loop. In alternativa: usawindow.location.replace(), che rimuove la sorgente dalla cronologia. - Ricorrere a un reindirizzamento JS in una migrazione permanente e ad alto valore quando è disponibile un 301. I reindirizzamenti JS vengono elaborati solo dopo il rendering, che può essere ritardato o fallire del tutto — il rischio sbagliato da correre su una pagina che conta. In alternativa: usa un 301 lato server; riserva JavaScript per piattaforme limitate e pagine di errore SPA.
- Concatenare il reindirizzamento JS in un altro reindirizzamento invece di arrivare alla destinazione finale in un unico salto. Le catene sprecano il crawl budget e possono apparire come un errore di reindirizzamento in GSC. In alternativa: punta il reindirizzamento JS direttamente all’URL di destinazione.
- Lasciare l’URL sorgente nella sitemap XML. Le sitemap dovrebbero elencare URL canonici e indicizzabili, non URL che reindirizzano. In alternativa: rimuovi la sorgente dalla sitemap una volta che il reindirizzamento è attivo.
- Lasciare che
robots.txtblocchi lo script che attiva il reindirizzamento. Se Googlebot non può recuperare il JS, non può eseguire il rendering del reindirizzamento, e la pagina sorgente può rimanere indicizzata indefinitamente. In alternativa: conferma che lo script sia crawlable — il tester robots.txt verifica esattamente questo. - Presumere che il frontmatter
aliases:di Hugo ti dia un 301. Storicamente ha generato una pagina HTML con meta refresh, non un reindirizzamento lato server — verifica l’output effettivo della tua versione distribuita piuttosto che presumere. In alternativa: usa regole di reindirizzamento a livello di piattaforma (Netlify_redirects, Cloudflare Workers, Vercelvercel.json) piùdisableAliases: true, come descritto in Hugo SEO. - Trattare
history.pushState()/replaceState()come un reindirizzamento. Essi riscrivono solo la barra degli indirizzi — nessuna navigazione, nessun segnale HTTP, e i crawler non li seguono. In alternativa: usa un vero link<a href>o una navigazione effettiva per qualsiasi cosa che debba essere crawlable. - Mostrare ai crawler una pagina e inviare gli utenti da un’altra parte (cloaking). Questo è ciò che trasforma un reindirizzamento JS legittimo in una violazione della policy sui reindirizzamenti subdoli — riguarda l’intento, non la tecnica. In alternativa: invia tutti, inclusi i bot, alla stessa destinazione.
Problemi comuni con i reindirizzamenti JavaScript
L’URL sorgente rimane indicizzato a lungo dopo che il reindirizzamento è attivo
- Causa probabile: la pagina è ancora nella coda di rendering di Google, oppure il rendering è fallito del tutto.
- Correzione + verifica: esegui un Live Test nello strumento URL
Inspection di Google Search Console sull’URL sorgente. Se non è ancora stato eseguito il rendering, attendi — Google
non fornisce una tempistica fissa per la coda di rendering, quindi ricontrolla periodicamente piuttosto
che presumere una finestra specifica. Se il rendering continua a fallire, conferma che lo
script di reindirizzamento non sia bloccato (vedi il problema
robots.txtsotto).
Il pulsante Indietro torna direttamente alla pagina di reindirizzamento
- Causa probabile: il reindirizzamento usa
window.location.hrefo.assign()invece di.replace(), quindi l’URL sorgente rimane nella cronologia della sessione. - Correzione + verifica: cambia lo script a
window.location.replace(). Conferma arrivando alla destinazione e premendo Indietro — dovrebbe saltare completamente la sorgente del reindirizzamento.
GSC mostra “Crawled – currently not indexed” invece di “Page with redirect”
- Causa probabile: Google non ha ancora renderizzato la pagina, oppure il rendering sta fallendo per quell’URL.
- Correzione + verifica: esegui una scansione dell’URL con un crawler che esegue il rendering JavaScript (Screaming Frog o Ahrefs Site Audit, con rendering abilitato) per confermare che il redirect venga effettivamente attivato lato client. Verifica anche che lo script di redirect non sia bloccato in
robots.txt— il tester robots.txt conferma se Googlebot può recuperarlo.
Una rotta SPA non risolta appare come soft 404 in GSC
- Causa probabile: la rotta reindirizza da qualche parte, ma la destinazione non restituisce effettivamente uno stato HTTP
404. - Correzione + verifica: punta il redirect a un endpoint che risponda realmente con
404(il pattern approvato da Google), poi esegui di nuovo URL Inspection per vedere il cambiamento di stato da soft 404 a 404 pulito.
Una pagina con redirect JavaScript appare ancora come un semplice 200 in un report di scansione
- Causa probabile: il crawler è stato eseguito senza rendering JavaScript abilitato, quindi ha visto solo la risposta HTML iniziale, non la navigazione lato client.
- Correzione + verifica: esegui di nuovo la scansione con rendering JS attivato (un timeout minimo di 5 secondi è un punto di partenza ragionevole) e conferma che il redirect ora venga visualizzato.
Dimostrare che il redirect ha effettivamente avuto effetto
| Verifica da eseguire | Risultato atteso | Interpretazione del fallimento | Finestra di monitoraggio | Condizione di annullamento |
|---|---|---|---|---|
| Prima di affidarti al redirect, apri lo strumento di verifica delle direttive per i crawler, inserisci l’indirizzo della risorsa che contiene il codice lato client e controlla il risultato per Googlebot | La risorsa risulta consentita e può essere recuperata dal crawler per eseguire correttamente il rendering della pagina | Se risulta non consentita, Google non può recuperare il codice, non vede la navigazione lato client e può continuare a trattare la pagina sorgente come una normale risposta | Immediato | Correggi o rimuovi la regola di blocco in robots.txt, ripeti il controllo e conferma l’accesso prima di fare affidamento sul redirect |
| Scansiona l’URL sorgente con rendering JS abilitato (Screaming Frog / Ahrefs Site Audit) | Il crawler segnala una navigazione lato client verso la destinazione prevista | La pagina segnala ancora un semplice 200 senza navigazione — il rendering non si attiva | Immediato (singola scansione) | Se non si attiva ancora dopo aver corretto robots.txt, usa un meta refresh a 0 secondi o un redirect lato server |
| Esegui il test in tempo reale di Controllo URL in GSC sull’URL sorgente | Il risultato renderizzato mostra l’esecuzione del redirect verso la destinazione | Il rendering non riesce oppure l’HTML renderizzato non mostra alcuna navigazione | Immediato per il test | Se il test non riesce ripetutamente a eseguire il rendering, considera la piattaforma inadatta a un redirect JS: ottieni accesso al server o usa un meta refresh |
| GSC — Report di indicizzazione delle pagine per l’URL sorgente | L’URL sorgente è elencato sotto “Page with redirect” (traduzione) «Pagina con reindirizzamento» | Risulta ancora indicizzato, “Crawled – currently not indexed,” (traduzione) «Sottoposta a scansione, ma attualmente non indicizzata» o contenuto duplicato | 2–4 settimane (lo stato di indicizzazione si aggiorna secondo i tempi di Google) | Se dopo 4+ settimane non è ancora classificato come redirect, ricontrolla i controlli di blocco del rendering sopra |
| Verifica manuale del pulsante indietro nel browser dopo essere atterrati sulla destinazione | Il pulsante indietro salta completamente la pagina sorgente | Il pulsante indietro torna alla pagina sorgente | Immediato | Cambia lo script da .href/.assign() a window.location.replace() |
Mettiti alla prova: Redirect JavaScript
Cinque domande rapide sul funzionamento dei redirect JavaScript e sui casi in cui usarli. Scegli una risposta per ciascuna, quindi verifica.
Risorse che meritano il tuo tempo
Altri miei contenuti
- Problemi di SEO JavaScript e best practice — il rendering, da cui deriva il rischio di ritardi dei redirect JS.
- Guida introduttiva alla SEO tecnica — il ruolo di redirect e rendering nel quadro generale.
I miei interventi
- Come funziona la Ricerca (SlideShare) — la mia spiegazione di scansione, rendering, indicizzazione e posizionamento: la pipeline che colloca un redirect JS nella terza fase. Resta valida la mia consueta precisazione: “This is my understanding of systems… not going to be 100% complete or accurate.” (traduzione) «Questa è la mia interpretazione dei sistemi… non sarà completa o accurata al 100%.»
Dal settore
- Redirect e Ricerca Google (Google Search Central) — la gerarchia ufficiale delle preferenze e la gestione di redirect permanenti e temporanei.
- Redirect ingannevoli (Google Search Central) — la linea della policy sullo spam che separa un redirect legittimo dal cloaking.
- Redirect JavaScript e SEO: quando e come usarli (Search Engine Journal) — indicazioni pratiche di implementazione e la distinzione tra
replace()e.href. - I redirect JavaScript sono compatibili con la SEO? (Search Engine Journal) — il riepilogo “evita quando esistono alternative”.
- Redirect JavaScript e SEO: la guida completa (OnCrawl) — indicazioni sul posizionamento nell’head, strumenti di rilevamento e la citazione completa di Gary Illyes.
- I redirect JavaScript danneggiano la SEO? (Conductor) — una risposta concisa in stile FAQ per la query informativa.
- Guida ai tipi di redirect (Lumar) — una tassonomia più ampia dei redirect con i redirect JavaScript nel contesto.
Cronologia modifiche
Aggiornato il 11 ago 2026.
Riepilogo editoriale e dettagli registrati delle modifiche.Dettagli delle modifiche
-
Le note dettagliate sulle modifiche sono attualmente disponibili in inglese.
-
Le note dettagliate sulle modifiche sono attualmente disponibili in inglese.
-
Le note dettagliate sulle modifiche sono attualmente disponibili in inglese.
Confronto completo non disponibile — non è stata archiviata alcuna istantanea precedente per questa revisione.
Aggiornato il 11 ago 2026.
Riepilogo editoriale e dettagli registrati delle modifiche.Dettagli delle modifiche
-
Le note dettagliate sulle modifiche sono attualmente disponibili in inglese.
-
Le note dettagliate sulle modifiche sono attualmente disponibili in inglese.
Confronto completo non disponibile — non è stata archiviata alcuna istantanea precedente per questa revisione.
Aggiornato il 18 lug 2026.
Riepilogo editoriale e dettagli registrati delle modifiche.Dettagli delle modifiche
-
Le note dettagliate sulle modifiche sono attualmente disponibili in inglese.
-
Le note dettagliate sulle modifiche sono attualmente disponibili in inglese.
-
Le note dettagliate sulle modifiche sono attualmente disponibili in inglese.
-
Le note dettagliate sulle modifiche sono attualmente disponibili in inglese.
Confronto completo non disponibile — non è stata archiviata alcuna istantanea precedente per questa revisione.