JavaScript Các chuyển hướng

Điều gì một JavaScript chuyển hướng là, cách Google render pipeline xử lý điều này differently từ một máy chủ-side 301, khi đây là an acceptable cuối cùng resort, và cách implement và detect một — plus nơi meta refresh và đó History API fit.

Xuất bản lần đầu: 27 thg 6, 2026 · Cập nhật lần cuối: 8 thg 8, 2026 · Advanced
Ngôn ngữ
1 tín hiệu bằng chứng trên trang này

MỘT JavaScript chuyển hướng gửi người dùng và các crawler để một new URL với client-side code (window.location.replace() hoặc .href). đây là đó least reliable chuyển hướng loại vì Google chỉ sees điều này sau kết xuất — mà có thể là delayed, hoặc fail hoàn toàn, với không có mốc thời gian cố định either way. Google chính thức order of preference là máy chủ-side (301/302/307/308) → meta refresh → JavaScript, và của nó tài liệu chẳng hạn plainly: chỉ dùng JS các chuyển hướng nếu bạn không thể làm đó other hai. Khi Google successfully interprets một, đó đích becomes một tín hiệu canonicalization — nhưng đó là không một proven bảo đảm of giống hệt PageRank hoặc xếp hạng outcomes để một 301, so treat điều này as một cuối cùng resort thay vì một như-cho-như đổi. Dùng them on constrained các nền tảng với không máy chủ access, cho SPA lỗi các trang đó trỏ đến một real 404, và little khác. Nếu bạn phải dùng một, dùng window.location.replace() trong đó <head>, drop đó nguồn URL từ của bạn sitemap, và point liên kết nội bộ tại đó cuối đích. Meta refresh là một tách biệt HTML-cấp độ chuyển hướng, và history.pushState()/replaceState() không các chuyển hướng tại all.

Tóm tắt — JavaScript chuyển hướng là client-side chuyển hướng (window.location.replace(), .href, .assign()) đó Google chỉ xử lý sau khi kết xuất — phase three của crawl → render → chỉ mục. máy chủ-side 301 là seen tại crawl time; JS chuyển hướng chờ on render queue, và Google cho không có mốc thời gian cố định cho đó chờ — nó có thể là nhanh hoặc nó có thể take dài trong khi, và kết xuất có thể fail outright. Google được ghi lại preference order là máy chủ-side → meta refresh → JavaScript, và tài liệu chẳng hạn để sử dụng JS các chuyển hướng chỉ Khi Bạn có thể’t làm khác hai. sau khi Google successfully interprets một, đích becomes vĩnh viễn canonicalization tín hiệu — ngay cả Google được sử dụng them on của họ own blog Khi không có gì khác worked — nhưng đó không được ghi lại proof của giống hệt PageRank hoặc xếp hạng outcomes để 301, so họ’re cuối cùng resort, không spam tín hiệu. legitimate dùng là constrained các nền tảng với không máy chủ config và SPA lỗi các trang đó point tại thực 404. Implement với window.location.replace() trong <head>, drop nguồn từ của bạn sitemap, repoint liên kết nội bộ, và xác nhận Googlebot có thể fetch JS. Meta refresh là HTML-cấp độ (0s = vĩnh viễn, bất kỳ delay = tạm thời), và history.pushState()/replaceState() không phải các chuyển hướng tại all.

Điều gì được tính as JavaScript chuyển hướng

Script navigation phụ thuộc vào kết xuất và execution, so nó không phải giao thức-tương đương để HTTP chuyển hướng. 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 Processing là có thể, không chính xác-timing hoặc lập chỉ mục bảo đảm. 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

JavaScript chuyển hướng navigates trình duyệt để new URL với client-side code. phổ biến các phương thức, và Cách họ differ:

  • window.location.replace("url") — navigates và xóa gốc URL từ session history. Đây là một để sử dụng: lại button skips chuyển hướng nguồn thay vì bouncing người dùng straight lại.
  • window.location.href = "url" — navigates nhưng giữ gốc trong history, so lại button trả về để chuyển hướng trang (và có thể tạo loop). document.location.hrefwindow.location.assign("url") behave giống nhau way.
  • history.pushState() / history.replaceState()không các chuyển hướng. họ rewrite address bar không có bất kỳ navigation hoặc HTTP tín hiệu, so các crawler không treat them as các chuyển hướng. SPAs sử dụng them cho trong-app URL thay đổi; họ cần thực <a href> links (hoặc thực tế navigations) để là crawlable.

dividing line đó matters: .replace(), .href, và .assign() all trigger thực document navigation ( khác biệt giữa them là chỉ Điều gì happens để session history), trong khi pushState()/replaceState() không bao giờ navigate tại all — họ touch history state và address bar và không có gì khác. None của four là HTTP 301; “chuyển hướng” ở đây là shorthand cho client-side navigation, không status code.

Meta refresh (<meta http-equiv="refresh" content="0;url=...">) là thường lumped trong với JS các chuyển hướng, nhưng nó HTML directive parsed trước khi JavaScript chạy — tách biệt, nhiều hơn reliable category, covered dưới.

Cách Google xử lý JavaScript chuyển hướng

Đây là crux. Google pipeline chạy trong stages, và JS chuyển hướng và máy chủ-side chuyển hướng nhận caught tại khác ones:

  1. Crawl — Googlebot fetches đó URL và đọc đó thô HTML. MỘT máy chủ-side 301/302/307/308 là seen right ở đây.
  2. Render queue — các trang đó trả về 200 chờ để là được kết xuất. Google tài liệu note đó trang “may stay on this queue for a few seconds, but it can take longer than that.” (bản dịch) «có thể stay on này queue cho vài seconds, nhưng điều này có thể take lâu hơn đó.» Google không publish một fixed service-cấp độ timeline beyond đó, so treat đó chờ as unpredictable — điều này có thể là nhanh, hoặc điều này có thể drag — rather hơn assuming bất kỳ cụ thể number of days hoặc weeks.
  3. Render + chỉ mục — headless Chromium chạy đó JavaScript. Này là đó đầu tiên moment một JS chuyển hướng tồn tại as far as Google là concerned.

giống nhau ý tưởng I làm on Crawling và trong JavaScript SEO áp dụng ở đây: kết xuất là tách biệt step từ fetching, và bất cứ điều gì đó phụ thuộc vào nó inherits đó delay và đó risk.

Và đó risk là 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.” (bản dịch) «Trong khi Google attempts để render mỗi URL Googlebot được crawl, kết xuất có thể fail cho various reasons. Này có nghĩa là đó nếu bạn set một JavaScript chuyển hướng, Google có thể không bao giờ see điều này nếu kết xuất of đó nội dung failed.» (Google Search Central) During đó window trước đó chuyển hướng là processed — và forever, nếu kết xuất fails — Google có thể giữ đó empty trang nguồn trong của nó chỉ mục.

Google chính thức preference order

các chuyển hướng tài liệu lays out hierarchy từ phần lớn để least reliable:

  1. máy chủ-side các chuyển hướng — 301/308 (vĩnh viễn), 302/307 (tạm thời). Best cho mọi thứ: seen tại crawl time, unambiguous.
  2. Meta refresh — HTML-cấp độ. 0-thứ hai meta refresh là được xem như vĩnh viễn chuyển hướng (như 301); bất kỳ delayed meta refresh là được xem như tạm thời.
  3. JavaScript các chuyển hướng — cuối cùng resort.

Google words: “Only use JavaScript redirects if you can’t do server-side or meta refresh redirects.” (bản dịch) «Chỉ dùng JavaScript các chuyển hướng nếu bạn không thể làm máy chủ-side hoặc meta refresh các chuyển hướng.» Vĩnh viễn các chuyển hướng truyền đó tín hiệu canonical để đó đích; tạm thời ones giữ đó original trong kết quả. (Cách đó interacts với canonical selection là over on Canonicalization.)

Làm giá trị liên kết truyền qua?

Google own các chuyển hướng tài liệu lists JavaScript location navigation among của nó vĩnh viễn redirection các phương thức, và says đó đích becomes đó canonicalization tín hiệu khi Google có interpreted điều này — so đó flat “JS redirects don’t pass PageRank” (bản dịch) «JS các chuyển hướng không truyền PageRank» claim là sai. Điều gì đó tài liệu không establish là đó outcome là giống hệt, immediate, hoặc as reliable as một máy chủ-side 301 — điều này mô tả đó tín hiệu canonical, không phải là bảo đảm of matching PageRank flow, xếp hạng, hoặc timing. Đó honest cách diễn đạt: một 301 truyền đó tín hiệu tại crawl time với near-certainty; một JS chuyển hướng truyền điều này chỉ nếu và khi kết xuất succeeds, và Google không promise đó kết quả sẽ match một 301’s outcome một-cho-một. Đó khoảng trống — không lost equity — là đó real cost of chọn JavaScript.

Đây là cũng Vì sao JS các chuyển hướng không phải hình phạt trigger on của họ own. họ chỉ become spam vấn đề Khi họ’re được sử dụng cho cloaking — cho thấy các crawler một trang và chuyển hướng người dùng để điều gì đó khác, hoặc sending mobile người dùng để unrelated domain. Google sneaky các chuyển hướng policy là về đó intent, không technique.

Khi JavaScript chuyển hướng là right tool

có legitimate cases:

  • Constrained các nền tảng. Some shared hosting, CDN, hoặc CMS setups cho bạn không access để máy chủ-side chuyển hướng rules. MỘT JS chuyển hướng là một hợp lệ fallback — và notably, Google dùng JS các chuyển hướng on của họ own Quản trị viên web blog vì, as Gary Illyes put điều này, “that was the only thing we could use for 1:1 redirects, and it works on Google” (bản dịch) «đó đã là điều duy nhất we có thể dùng cho 1:1 các chuyển hướng, và điều này hoạt động on Google» (OnCrawl).
  • SPA lỗi xử lý. Google explicitly endorses này: “Use a JavaScript redirect to a URL for which the server responds with a 404 HTTP status code.” (bản dịch) «Dùng một JavaScript chuyển hướng để một URL cho mà đó máy chủ responds với một 404 HTTP mã trạng thái.» (Google Search Central) MỘT single-trang app đó resolves một bad route có thể chuyển hướng để một real 404 endpoint so Google xử lý đó lỗi correctly thay vì lập chỉ mục một soft 404.

cho vĩnh viễn URL migrations, Đây là không tool — sử dụng 301. I làm giống nhau point trong trang web migrations: JavaScript các chuyển hướng là cuối cùng resort, và Google có thể không bao giờ see them.

Static trang web generators: Hugo aliases trap

phổ biến surprise: Hugo aliases: frontmatter có trong lịch sử generated meta refresh HTML các trang, không máy chủ-side 301s — và khác static generators có đã xong similar điều theo mặc định. Generator defaults thay đổi giữa versions, so kiểm tra của bạn hiện tại deployed version thực tế output thay vì assuming; nếu aliases: không phải giving bạn 301s, bạn cần nền tảng-cấp độ chuyển hướng rules (Netlify _redirects, Cloudflare Workers, Vercel vercel.json) plus (on Hugo) disableAliases: true. I cover điều này trong detail trong Hugo SEO.

Implementation thực hành tốt nhất

nếu JavaScript chuyển hướng là genuinely của bạn chỉ option:

  • Dùng window.location.replace(), không .href. As Search Engine Journal diễn đạt điều này, JS các chuyển hướng “typically use window.location.replace() function rather than window.location.href to avoid UX redirect loops” (bản dịch) «typically dùng window.location.replace() function thay vì window.location.href để tránh UX chuyển hướng loops» (SEJ).
  • Put điều này trong đó <head>, không đó <body>. Các trình duyệt parse HTML sequentially và chạy scripts as they hit them, so “position JavaScript redirects in the <head> tag rather than <body> to minimize delay” (bản dịch) «position JavaScript các chuyển hướng trong đó thẻ head tag thay vì thẻ thân phản hồi để minimize delay» (OnCrawl).
  • Chuyển hướng để đó cuối đích trong một hop. MỘT JS chuyển hướng để một trang đó itself 301s elsewhere làm một chain; chains waste ngân sách crawl và có thể surface trong GSC as một lỗi chuyển hướng.
  • Xóa đó nguồn URL từ của bạn XML sitemap. Sitemaps nên list canonical, indexable URLs — không chuyển hướng ones.
  • Repoint liên kết nội bộ tại đó đích, so they không route qua đó chuyển hướng tại all.
  • Hãy bảo đảm Googlebot có thể fetch đó JS. Nếu đó chuyển hướng lives trong an external script blocked by robots.txt, Google không thể render điều này và sẽ không see đó chuyển hướng.

Cách detect JavaScript các chuyển hướng

họ không announce themselves như 301 trong header, so bạn có để render:

  • MỘT crawler với JS kết xuất on. OnCrawl khuyến nghị crawling với “JavaScript rendering enabled (5-second timeout minimum)” (bản dịch) «JavaScript kết xuất enabled (5-second timeout minimum)»; Screaming Frog và Ahrefs Site Audit có thể cả hai render. Không có kết xuất, một JS-chuyển hướng trang chỉ looks như một thông thường 200.
  • Chrome DevTools. Đó Network tab (với “Preserve log” (bản dịch) «Bảo toàn log») cho thấy đó client-side navigation; đó Chuyển hướng Path extension flags điều này cũng.
  • Trong Search Console, một successfully processed JS chuyển hướng cho thấy lên dưới Trang với chuyển hướng — đó giống nhau status as bất kỳ được chuyển hướng URL, mà là thông thường cho non-canonical sources. Đó label không guaranteed on bất kỳ được cho kiểm tra, though: điều này reflects whatever Google fetched, được kết xuất, interpreted, và canonicalized tại đó sampled moment, so một URL có thể cho thấy một khác nhau status (hoặc không chuyển hướng status tuy vậy) giữa kiểm tra không có đó đang an lỗi on của bạn end.

Điều gì I’d thực ra làm

máy chủ-side đầu tiên, mỗi time. Meta refresh (0-thứ hai) Khi Bạn có thể edit HTML nhưng không máy chủ config. JavaScript chỉ Khi cả hai là off bảng — và sau đó với window.location.replace() trong <head>, sạch sitemap, và kiểm tra đó chuyển hướng thực ra renders cho Googlebot. cho bất cứ điều gì vĩnh viễn hoặc cao-giá trị, extra reliability của 301 là worth gần như bất kỳ effort để obtain.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.