JavaScript Redirections

Ce que a JavaScript redirection est, comment Google's rendre pipeline treats il differently depuis a serveur-side 301, quand c’est an acceptable dernier resort, et comment implement et detect un — plus où meta refresh et le History API fit.

Première publication : 27 juin 2026 · Dernière mise à jour : 3 août 2026 · Avancé
1 indice probant sur cette page

«A JavaScript redirect sends users and crawlers to a new URL with client-side code (window.location.replace() or .href). It's the least reliable redirect type because Google only sees it after rendering — which can be delayed, or fail entirely, with no fixed timeline either way. Google's official order of preference is server-side (301/302/307/308) → meta refresh → JavaScript, and its docs say plainly: only use JS redirects if you can't do the other two. Once Google successfully interprets one, the target becomes a canonicalization signal — but that's not a proven guarantee of identical PageRank or ranking outcomes to a 301, so treat it as a last resort rather than a like-for-like swap. Use them on constrained platforms with no server access, for SPA error pages that point to a real 404, and little else. If you must use one, use window.location.replace() in the <head>, drop the source URL from your sitemap, and point internal links at the final destination. Meta refresh is a separate HTML-level redirect, and history.pushState()/replaceState() aren't redirects at all.» _(Traduction)_ (Résumé en français du champ tldr : le texte source est conservé pour relecture francophone.)

TL;DR — A JavaScript redirection est a client-side redirection (window.location.replace(), .href, .assign()) que Google seulement processes après rendu — phase three de explorer → rendre → indexer. A serveur-side 301 est vu à explorer temps; a JS redirection waits on le rendre queue, et Google donne aucun fixed timeline pour que wait — il peut être rapide or il peut prendre a long pendant que, et rendu peut échouer outright. Google’s documented preference order est serveur-side → meta refresh → JavaScript, et le docs dire à utiliser JS redirections seulement quand vous pouvez’t faire le autre deux. Une fois Google successfully interprets un, le cible becomes a permanent canonicalization signal — même Google utilisé les on leur propre blog quand rien sinon worked — mais c’est pas documented proof de identical PageRank or classement résultats à a 301, donc ils sont a dernier resort, pas a spam signal. Le legitimate utilise sont constrained platforms avec aucun serveur config et SPA erreur pages que point à a réel 404. Implement avec window.location.replace() dans le <head>, drop le source depuis votre sitemap, repoint lien internes, et confirmer Googlebot peut récupérer le JS. Meta refresh est HTML-level (0s = permanent, quelconque delay = temporary), et history.pushState()/replaceState() ne sont pas redirections à tout.

Ce que counts as a JavaScript redirection

Script navigation dépend on rendering and execution, so it n’est pas protocol-equivalent to an HTTP redirection. Preuve à l’appui de cette affirmation Primary standard or official documentation supporting the adjacent article claim. Portée : Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Niveau de confiance : élevé · Vérifié : Google: JavaScript redirects Processing is possible, pas an exact-timing or indexation guarantee. Preuve à l’appui de cette affirmation Primary standard or official documentation supporting the adjacent article claim. Portée : Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Niveau de confiance : élevé · Vérifié : Google: Redirects and Search

A JavaScript redirection navigates le navigateur à a nouveau URL avec client-side code. Le courant méthodes, et comment ils differ:

  • window.location.replace("url") — navigates et supprime le original URL depuis session history. Ce est le un à utiliser: le back button skips le redirection source au lieu de bouncing le utilisateur straight back.
  • window.location.href = "url" — navigates mais garde le original dans history, donc le back button renvoie à le redirecting page (et peut créer a loop). document.location.href et window.location.assign("url") behave le même façon.
  • history.pushState() / history.replaceState() — pas redirections. Ils rewrite le adresse bar sans quelconque navigation or HTTP signal, donc robots d’exploration ne pas treat les as redirections. SPAs utiliser les pour dans-app URL changements; ils besoin réel <a href> liens (or réel navigations) à être crawlable.

Le dividing line que matters: .replace(), .href, et .assign() tout trigger a réel document navigation (le difference entre les est seulement ce que se produit à session history), pendant que pushState()/replaceState() jamais navigate à tout — ils touch history state et le adresse bar et rien sinon. None de le four est an HTTP 301; “redirect” ici est shorthand pour client-side navigation, pas a status code.

Meta refresh (<meta http-equiv="refresh" content="0;url=...">) is souvent lumped in with JS redirections, but it’s an HTML directive parsed avant JavaScript runs — a separate, plus reliable category, covered ci-dessous.

How Google processes a JavaScript redirection

Ce est le crux. Google’s pipeline exécute dans stages, et a JS redirection et a serveur-side redirection obtenir caught à différent ones:

«1. Crawl — Googlebot fetches the URL and reads the raw HTML. A server-side 301/302/307/308 is seen right here. 2. Render queue — pages that return 200 wait to be rendered. Google’s docs note the page “may stay on this queue for a few seconds, but it can take longer than that.” Google doesn’t publish a fixed service-level timeline beyond that, so treat the wait as unpredictable — it can be quick, or it can drag — rather than assuming any specific number of days or weeks. 3. Render + index — headless Chromium runs the JavaScript. This is the first moment a JS redirect exists as far as Google is concerned. » (Traduction) (Résumé en français de la section trente et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

Le même idea Je faire on Exploration et dans JavaScript SEO s’applique ici: rendu est a séparé étape depuis fetching, et n’importe quoi que dépend on il inherits que delay et que risque.

«And the risk is real. 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.” (Google Search Central) During the window before the redirect is processed — and forever, if rendering fails — Google may keep the empty source page in its index. » (Traduction) (Résumé en français de la section trente-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«## Google’s official preference order » (Traduction) (Résumé en français de la section trente-quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«The redirects documentation lays out a hierarchy from most to least reliable: » (Traduction) (Résumé en français de la section trente-cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«1. Server-side redirects — 301/308 (permanent), 302/307 (temporary). Best for everything: seen at crawl time, unambiguous. 2. Meta refresh — HTML-level. A 0-second meta refresh is treated as a permanent redirect (like a 301); any delayed meta refresh is treated as temporary. 3. JavaScript redirects — last resort. » (Traduction) (Résumé en français de la section trente-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«Google’s words: “Only use JavaScript redirects if you can’t do server-side or meta refresh redirects.” Permanent redirects pass the canonical signal to the target; temporary ones keep the original in results. (How that interacts with canonical selection is over on Canonicalization.) » (Traduction) (Résumé en français de la section trente-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

Fait popularité des liens réussir via?

«Google’s own redirects documentation lists JavaScript location navigation among its permanent redirection methods, and says the target becomes the canonicalization signal once Google has interpreted it — so the flat “JS redirects don’t pass PageRank” claim is false. What the documentation doesn’t establish is that the outcome is identical, immediate, or as reliable as a server-side 301 — it describes the canonical signal, not a guarantee of matching PageRank flow, ranking, or timing. The honest framing: a 301 passes the signal at crawl time with near-certainty; a JS redirect passes it only if and when rendering succeeds, and Google doesn’t promise the result will match a 301’s outcome one-for-one. That gap — not lost equity — is the real cost of choosing JavaScript. » (Traduction) (Résumé en français de la section trente-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

Ce est aussi pourquoi JS redirections ne sont pas a penalty trigger on leur propre. Ils seulement become a spam problème quand ils sont utilisé pour cloaking — showing robots d’exploration un page et redirecting utilisateurs à quelque chose différent, or sending mobile utilisateurs à an unrelated domain. Google’s sneaky redirections policy est à propos de que intent, pas le technique.

Quand a JavaScript redirection is the correct outil

Là are legitimate cas:

«- Constrained platforms. Some shared hosting, CDN, or CMS setups give you no access to server-side redirect rules. A JS redirect is a valid fallback — and notably, Google used JS redirects on their own Webmaster blog because, as Gary Illyes put it, “that was the only thing we could use for 1:1 redirects, and it works on Google” (OnCrawl). » (Traduction) (Résumé en français de la section quarante-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- SPA error handling. Google explicitly endorses this: “Use a JavaScript redirect to a URL for which the server responds with a 404 HTTP status code.” (Google Search Central) A single-page app that resolves a bad route can redirect to a real 404 endpoint so Google processes the error correctly instead of indexing a soft 404. » (Traduction) (Résumé en français de la section quarante-trois, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)

Pour permanent URL migrations, ce est pas le outil — utiliser a 301. Je faire le même point dans migration de sites: JavaScript redirections sont a dernier resort, et Google peut jamais voir les.

Static site generators: le Hugo aliases trap

A courant surprise: Hugo’s aliases: frontmatter has historically generated meta refresh HTML pages, pas server-side 301s — and autre static generators have fait similaire choses by par défaut. Generator defaults modifier entre versions, so vérifier votre current deployed version’s réel output plutôt que assuming; si aliases: isn’t giving vous 301s, vous besoin platform-level redirection rules (Netlify _redirects, Cloudflare Workers, Vercel vercel.json) plus (on Hugo) disableAliases: true. I cover ce in detail in Hugo SEO.

Implementation meilleur practices

Si a JavaScript redirection is genuinely votre seulement option:

  • Utiliser window.location.replace(), pas .href. As Moteur de recherche Journal puts il, JS redirections “typically utiliser window.location.replace() function plutôt que window.location.href à éviter UX boucle de redirectionss” (SEJ).
  • Put il dans le <head>, pas le <body>. Navigateurs parse HTML sequentially et exécuter scripts as ils hit les, donc “position JavaScript redirections dans le <head> balise plutôt que <body> à minimize delay” (OnCrawl).
  • Redirection à le final destination dans un hop. A JS redirection à une page que itself 301s elsewhere rend a chain; chains waste budget d’exploration et peut surface dans GSC as a redirection erreur.
  • Supprimer l’URL source depuis votre XML sitemap. Sitemaps devrait liste canonical, indexable URLs — pas redirecting ones.
  • Repoint lien internes à le destination, donc ils ne pas route via le redirection à tout.
  • Assurez-vous Googlebot peut récupérer le JS. Si le redirection lives dans an external script bloqué par robots.txt, Google ne peut pas rendre il et ne va pas voir le redirection.

How to detect JavaScript redirections

Ils don’t announce themselves comme a 301 in a header, so vous have to render:

  • A robot d’exploration avec JS rendu on. OnCrawl recommends exploration avec “JavaScript rendu enabled (5-deuxième timeout minimum)”; Screaming Frog et Ahrefs Site Audit peut les deux rendre. Sans rendu, a JS-redirecting page simplement semble comme a normal 200.
  • Chrome DevTools. Le Network tab (avec “Preserve log”) montre le client-side navigation; le Redirection Chemin extension flags il aussi.
  • Dans Search Console, a successfully processed JS redirection montre up sous Page avec redirection — le même status as quelconque redirigé URL, qui est normal pour non-canonical sources. Que étiquette n’est pas guaranteed on quelconque donné vérifier, though: il reflects whatever Google récupéré, rendu, interpreted, et canonicalized à le sampled moment, donc une URL peut montrer a différent status (or aucun redirection status yet) entre vérifications sans que étant an erreur on votre fin.

Ce que I’d en réalité do

Serveur-side premier, chaque temps. Meta refresh (0-deuxième) quand vous pouvez edit HTML mais pas serveur config. JavaScript seulement quand les deux sont off le tableau — et alors avec window.location.replace() dans le <head>, a clean sitemap, et a vérifier que le redirection en réalité renders pour Googlebot. Pour n’importe quoi permanent or élevé-valeur, le supplémentaire reliability de a 301 est worth presque quelconque effort à obtain.

Ajouter une note d’expert

Épingler une citation d’expert

Nouvelle personne ? Créez son profil non revendiqué à /admin/experts/ → Épingler une citation d’expert d’abord.