Panduan JavaScript Redirects

Apa sebuah JavaScript redirect adalah, bagaimana Google's render pipeline memperlakukan ini differently dari sebuah server-side 301, ketika ini adalah sebuah acceptable terakhir resort, dan cara implement dan detect satu — plus di mana meta refresh dan History API fit.

Pertama kali diterbitkan: 27 Jun 2026 · Terakhir diperbarui: 3 Agu 2026 · Lanjutan
1 sinyal bukti di halaman ini

sebuah JavaScript redirect mengirim pengguna dan crawler untuk sebuah baru URL dengan client-side code (window.location.replace() atau.href). ini adalah paling sedikit reliable redirect jenis karena Google hanya sees ini setelah rendering — yang dapat menjadi delayed, atau fail entirely, dengan Tidak fixed timeline either cara. Google's official order dari preference adalah server-side (301/302/307/308) → meta refresh → JavaScript, dan -nya docs say plainly: hanya gunakan JS redirects jika Anda dapat't melakukan lainnya dua. Setelah Google successfully interprets satu, target becomes sebuah canonicalization sinyal — tetapi itu's tidak sebuah proven jaminan dari identical PageRank atau peringkat outcomes untuk sebuah 301, so treat ini sebagai sebuah terakhir resort alih-alih sebuah like-untuk-like tukar. gunakan them pada constrained platforms dengan Tidak server access, untuk SPA halaman error itu poin untuk sebuah nyata 404, dan little else. jika Anda harus gunakan satu, gunakan window.location.replace() di <head>, drop sumber URL dari Anda sitemap, dan poin tautan internal di akhir destination. Meta refresh adalah sebuah terpisah HTML-tingkat redirect, dan history.pushState()/replaceState() tidak redirects di semua.

TL;DR — sebuah JavaScript redirect adalah sebuah client-side redirect (window.location.replace(), .href, .assign()) itu Google hanya memproses setelah rendering — phase three dari crawl → render → indeks. sebuah server-side 301 adalah seen di crawl time; sebuah JS redirect menunggu pada render queue, dan Google memberikan Tidak fixed timeline untuk itu tunggu — ini dapat menjadi quick atau ini dapat take sebuah panjang sementara, dan rendering dapat fail outright. Google’s terdokumentasi preference order adalah server-side → meta refresh → JavaScript, dan docs say untuk gunakan JS redirects hanya ketika Anda dapat’t melakukan lainnya dua. Setelah Google successfully interprets satu, target becomes sebuah permanent canonicalization sinyal — bahkan Google digunakan them pada mereka own blog ketika tidak ada apa pun else worked — tetapi itu’s tidak terdokumentasi proof dari identical PageRank atau peringkat outcomes untuk sebuah 301, so mereka’re sebuah terakhir resort, tidak sebuah spam sinyal. legitimate menggunakan adalah constrained platforms dengan Tidak server config dan SPA halaman error itu poin di sebuah nyata 404. Implement dengan window.location.replace() di <head>, drop sumber dari Anda sitemap, repoint tautan internal, dan konfirmasi Googlebot dapat fetch JS. Meta refresh adalah HTML-tingkat (0s = permanent, apa pun delay = temporary), dan history.pushState()/replaceState() tidak redirects di semua.

Apa counts sebagai sebuah JavaScript redirect

Script navigation bergantung pada rendering dan execution, so ini adalah tidak protocol-equivalent untuk sebuah HTTP redirect. Bukti untuk klaim ini Primary standard or official documentation supporting the adjacent article claim. Cakupan: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Tingkat keyakinan: tinggi · Diverifikasi: Google: JavaScript redirects Processing adalah mungkin, tidak sebuah tepat-timing atau pengindeksan jaminan. Bukti untuk klaim ini Primary standard or official documentation supporting the adjacent article claim. Cakupan: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Tingkat keyakinan: tinggi · Diverifikasi: Google: Redirects and Search

sebuah JavaScript redirect navigates browser untuk sebuah baru URL dengan client-side code. umum metode, dan bagaimana mereka differ:

  • window.location.replace("url") — navigates dan menghapus original URL dari session history. ini adalah satu untuk gunakan: back button skips redirect sumber alih-alih bouncing pengguna straight back.
  • window.location.href = "url" — navigates tetapi mempertahankan original di history, so back button mengembalikan untuk mengalihkan halaman (dan dapat buat loop). document.location.href dan window.location.assign("url") behave sama cara.
  • history.pushState() / history.replaceState() — tidak redirects. mereka rewrite address bar tanpa apa pun navigation atau HTTP sinyal, so crawler jangan treat them sebagai redirects. SPAs gunakan them untuk di-app URL perubahan; mereka perlu nyata <a href> tautan (atau sebenarnya navigations) untuk menjadi dapat di-crawl.

dividing line itu penting: .replace(), .href, dan .assign() semua trigger sebuah nyata document navigation ( perbedaan antara them adalah hanya apa happens untuk session history), sementara pushState()/replaceState() tidak pernah navigate di semua — mereka touch history state dan address bar dan tidak ada apa pun else. None dari four adalah sebuah HTTP 301; “redirect” (terjemahan) “redirect” di sini adalah shorthand untuk client-side navigation, tidak sebuah status code.

Meta refresh (<meta http-equiv="refresh" content="0;url=...">) adalah sering lumped di dengan JS redirects, tetapi ini adalah sebuah HTML directive parsed sebelum JavaScript berjalan — sebuah terpisah, lebih reliable category, covered di bawah.

Bagaimana Google memproses sebuah JavaScript redirect

ini adalah crux. Google’s pipeline berjalan di stages, dan sebuah JS redirect dan sebuah server-side redirect mendapatkan caught di berbeda 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. » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tiga puluh satu, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)

yang sama idea I membuat pada crawling dan di JavaScript SEO applies di sini: rendering adalah sebuah terpisah langkah dari fetching, dan apa pun itu bergantung pada ini inherits itu delay dan itu risk.

«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. » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tiga puluh tiga, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)

Google’s official preference order

redirects documentation lays out sebuah hierarchy dari sebagian besar untuk least reliable:

  1. server-side redirects — 301/308 (permanent), 302/307 (temporary). Best untuk semuanya: seen di crawl time, unambiguous.
  2. Meta refresh — HTML-tingkat. sebuah 0-kedua meta refresh adalah treated sebagai sebuah permanent redirect (like sebuah 301); apa pun delayed meta refresh adalah treated sebagai temporary.
  3. JavaScript redirects — terakhir resort.

«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.) » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tiga puluh tujuh, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)

melakukan tautan equity lulus melalui?

«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. » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tiga puluh sembilan, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)

ini adalah juga mengapa JS redirects tidak sebuah penalty trigger pada mereka own. mereka hanya become sebuah spam masalah ketika mereka’re digunakan untuk cloaking — menunjukkan crawler satu halaman dan mengalihkan pengguna untuk sesuatu berbeda, atau sending mobile pengguna untuk sebuah unrelated domain. Google’s sneaky redirects policy adalah tentang itu intent, tidak technique.

Ketika sebuah JavaScript redirect adalah right alat

ada legitimate cases:

«- 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). » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian empat puluh tiga, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.) «- 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. » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian empat puluh tiga, bagian kecil dua: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)

untuk permanent URL migrations, ini adalah tidak alat — gunakan 301. I membuat yang sama poin di situs migrations: JavaScript redirects adalah sebuah terakhir resort, dan Google dapat tidak pernah see them.

Static situs generators: Hugo aliases trap

sebuah umum surprise: Hugo’s aliases: frontmatter memiliki secara historis generated meta refresh HTML halaman, tidak server-side 301s — dan lainnya static generators memiliki selesai similar hal oleh default. Generator defaults perubahan antara versi, so periksa Anda saat ini deployed versi’s sebenarnya output alih-alih assuming; jika aliases: tidak giving Anda 301s, Anda perlu platform-tingkat redirect aturan (Netlify _redirects, Cloudflare Workers, Vercel vercel.json) plus (pada Hugo) disableAliases: true. I cover ini di detail di Hugo SEO.

Implementation best practices

jika sebuah JavaScript redirect adalah genuinely Anda hanya option:

  • gunakan window.location.replace(), tidak .href. sebagai mesin pencari Journal puts ini, JS redirects “typically gunakan window.location.replace() function rather daripada window.location.href untuk avoid UX redirect loops” (terjemahan) “typically gunakan tidak terdefinisi function alih-alih tidak terdefinisi untuk hindari UX redirect loops” (SEJ).
  • Put ini di <head>, tidak <body>. browser parse HTML sequentially dan jalankan scripts sebagai mereka hit them, so “position JavaScript redirects di itu <head> tag rather daripada <body> untuk minimize delay” (terjemahan) “position JavaScript redirects di tidak terdefinisi tag alih-alih tidak terdefinisi untuk minimize delay” (OnCrawl).
  • Redirect untuk akhir destination di satu hop. sebuah JS redirect untuk sebuah halaman itu itself 301s elsewhere membuat sebuah chain; chains waste anggaran crawling dan dapat surface di GSC sebagai sebuah redirect error.
  • hapus sumber URL dari Anda sitemap XML. Sitemaps seharusnya list canonical, dapat diindeks URLs — tidak mengalihkan ones.
  • Repoint tautan internal di destination, so mereka jangan route melalui redirect di semua.
  • pastikan Googlebot dapat fetch JS. jika redirect lives di sebuah external script blocked oleh robots.txt, Google dapat’t render ini dan tidak akan see redirect.

cara detect JavaScript redirects

mereka jangan announce themselves like sebuah 301 di sebuah header, so Anda memiliki untuk render:

  • sebuah crawler dengan JS rendering pada. OnCrawl recommends crawling dengan “JavaScript rendering enabled (5-second timeout minimum)” (terjemahan) “JavaScript rendering enabled (5-kedua timeout minimum)”; Screaming Frog dan Ahrefs situs Audit dapat keduanya render. Tanpa rendering, sebuah JS-mengalihkan halaman hanya looks like sebuah wajar 200.
  • Chrome DevTools. Network tab (dengan “Preserve log” (terjemahan) “pertahankan log”) menampilkan client-side navigation; Redirect Path extension flags ini too.
  • di Search Console, sebuah successfully processed JS redirect menampilkan up di bawah halaman dengan redirect — yang sama status sebagai apa pun redirected URL, yang adalah wajar untuk non-canonical sources. itu label tidak guaranteed pada apa pun diberikan periksa, though: ini reflects whatever Google fetched, dirender, interpreted, dan canonicalized di sampled moment, so sebuah URL dapat tampilkan sebuah berbeda status (atau Tidak redirect status namun) antara memeriksa tanpa itu menjadi sebuah error pada Anda end.

Apa I’d sebenarnya melakukan

server-side pertama, setiap time. Meta refresh (0-kedua) ketika Anda dapat edit HTML tetapi tidak server config. JavaScript hanya ketika keduanya adalah off table — dan lalu dengan window.location.replace() di <head>, sebuah bersih sitemap, dan sebuah periksa bahwa redirect sebenarnya renders untuk Googlebot. untuk apa pun permanent atau tinggi-nilai, extra reliability dari sebuah 301 adalah worth hampir apa pun effort untuk obtain.

Tambahkan catatan pakar

Sematkan kutipan pakar

Orang baru? Buat profilnya yang belum diklaim di /admin/experts/ → Sematkan kutipan pakar terlebih dahulu.