Przekierowania JavaScript
Czym jest przekierowanie JavaScript, jak potok renderowania Google traktuje je inaczej niż przekierowanie 301 po stronie serwera, kiedy jest akceptowalnym ostatecznym rozwiązaniem oraz jak je wdrożyć i wykryć — a także gdzie pasują meta refresh i History API.
1 sygnał dowodowy na tej stronie
- Powiązane działające narzędzierobots.txt Tester
Przekierowanie JavaScript wysyła użytkowników i roboty indeksujące na nowy adres URL za pomocą kodu po stronie klienta (window.location.replace() lub .href). Jest to najmniej niezawodny typ przekierowania, ponieważ Google widzi je dopiero po renderowaniu — które może być opóźnione lub całkowicie nieudane, bez ustalonego harmonogramu w żadnym przypadku. Oficjalna kolejność preferencji Google to: po stronie serwera (301/302/307/308) → meta refresh → JavaScript, a dokumentacja mówi wprost: używaj przekierowań JS tylko wtedy, gdy nie możesz zastosować pozostałych dwóch. Gdy Google pomyślnie zinterpretuje przekierowanie, cel staje się sygnałem kanonizacji — ale nie jest to udowodniona gwarancja identycznego PageRank lub wyników rankingowych jak w przypadku 301, więc traktuj je jako ostateczność, a nie zamiennik. Używaj ich na ograniczonych platformach bez dostępu do serwera, dla stron błędów SPA wskazujących na prawdziwy 404, i niewiele więcej. Jeśli musisz go użyć, użyj window.location.replace() w <head>, usuń źródłowy URL z mapy witryny i kieruj wewnętrzne linki na ostateczny cel. Meta refresh to osobne przekierowanie na poziomie HTML, a history.pushState()/replaceState() w ogóle nie są przekierowaniami.
TL;DR — Przekierowanie JavaScript używa kodu na stronie, aby wysłać Cię na inny URL po załadowaniu strony. Działa dla ludzi, ale wyszukiwarki traktują je mniej niezawodnie niż „prawdziwe” przekierowanie serwerowe (301). Jeśli możesz skonfigurować 301, zrób to. Zarezerwuj przekierowania JavaScript na sytuacje, gdy nie masz innej opcji.
Czym jest przekierowanie JavaScript
Przekierowanie JavaScript zmienia nawigację poprzez wykonanie skryptu, a nie odpowiedź HTTP 3xx. Dowód potwierdzający to twierdzenie Primary standard or official documentation supporting the adjacent article claim. Zakres: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Poziom ufności: wysoki · Zweryfikowano: Google: JavaScript redirects Google może przetwarzać przekierowania JavaScript, ale zaleca przekierowania po stronie serwera, gdy to możliwe. Dowód potwierdzający to twierdzenie Primary standard or official documentation supporting the adjacent article claim. Zakres: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Poziom ufności: wysoki · Zweryfikowano: Google: Redirects and Search
Istnieją dwa główne sposoby wysyłania kogoś z jednego URL na inny.
Pierwszy to przekierowanie po stronie serwera. Zanim strona się załaduje, serwer mówi „ta strona się przeniosła — przejdź tutaj” za pomocą kodu statusu, takiego jak 301 (stałe) lub 302 (tymczasowe). Przeglądarka i wyszukiwarka otrzymują tę wiadomość natychmiast.
Drugi to przekierowanie JavaScript. Strona ładuje się normalnie, a następnie fragment kodu uruchamia się w przeglądarce i wysyła Cię gdzie indziej. Coś w stylu:
<script>
window.location.replace("https://example.com/new-page/");
</script>Dla osoby klikającej po stronie, te dwa rozwiązania wydają się prawie takie same. Dla wyszukiwarki są bardzo różne — i ta różnica jest całym powodem istnienia tej strony.
Dlaczego wyszukiwarki traktują je inaczej
Google czyta Twoją stronę etapami. Najpierw przeszukuje (pobiera surowy HTML). Później renderuje stronę — faktycznie uruchamiając JavaScript, tak jak zrobiłaby to przeglądarka. Przekierowanie 301 po stronie serwera jest widoczne w pierwszym kroku. Przekierowanie JavaScript nie jest widoczne aż do etapu renderowania, który może nastąpić znacznie później — lub czasami wcale.
Google mówi to wprost: “Only use JavaScript redirects if you can’t do server-side or meta refresh redirects.” (tłumaczenie) „Używaj przekierowań JavaScript tylko wtedy, gdy nie możesz zastosować przekierowań po stronie serwera ani odświeżenia meta.” (Google Search Central)
Więc przekierowanie JavaScript nie jest złe — jest po prostu mniej niezawodne. Google zwykle w końcu tam dotrze, ale prawdziwe 301 jest szybsze i pewniejsze.
Prosta zasada
- Czy możesz ustawić 301 (lub 302)? Zrób to. To złoty standard.
- Nie możesz dotknąć serwera, ale możesz edytować
<head>HTML? 0-sekundowy meta refresh to kolejna najlepsza opcja. - Żadne z powyższych? Wtedy przekierowanie JavaScript jest dobrym ostatecznym rozwiązaniem.
Kilka rzeczy, które ludzie mylą:
- Meta refresh to nie przekierowanie JavaScript. To znacznik
<meta>w Twoim HTML, a Google obsługuje go wcześniej i bardziej niezawodnie niż JS. history.pushState()to nie przekierowanie. To tylko zmienia zawartość paska adresu — nie wysyła nikogo nigdzie, a wyszukiwarki go nie śledzą.
Chcesz poznać timing potoku renderowania, szczegóły implementacji i jak znaleźć przekierowania JS w przeszukiwaniu? Przełącz się na zakładkę Zaawansowane.
TL;DR — Przekierowanie JavaScript to przekierowanie po stronie klienta (
window.location.replace(),.href,.assign()), które Google przetwarza dopiero po renderowaniu — faza trzecia procesu crawl → render → index. Przekierowanie 301 po stronie serwera jest widoczne podczas crawl; przekierowanie JS czeka w kolejce renderowania, a Google nie podaje stałego harmonogramu tego oczekiwania — może być szybkie lub zająć dużo czasu, a renderowanie może całkowicie się nie udać. Udokumentowana preferencja Google to serwer → meta refresh → JavaScript, a dokumentacja mówi, aby używać przekierowań JS tylko wtedy, gdy nie można zastosować pozostałych dwóch. Gdy Google pomyślnie je zinterpretuje, cel staje się stałym sygnałem kanonizacji — nawet Google używał ich na swoim blogu, gdy nic innego nie działało — ale to nie jest udokumentowany dowód identycznych wyników PageRank lub rankingowych jak w przypadku 301, więc są one ostatecznością, a nie sygnałem spamu. Uzasadnione zastosowania to ograniczone platformy bez konfiguracji serwera oraz strony błędów SPA wskazujące na prawdziwy 404. Implementuj za pomocąwindow.location.replace()w<head>, usuń źródło z mapy witryny, zmień linki wewnętrzne i potwierdź, że Googlebot może pobrać JS. Meta refresh jest na poziomie HTML (0s = stałe, dowolne opóźnienie = tymczasowe), ahistory.pushState()/replaceState()w ogóle nie są przekierowaniami.
Co liczy się jako przekierowanie JavaScript
Nawigacja skryptowa zależy od renderowania i wykonania, więc nie jest równoważna protokołowo przekierowaniu HTTP. Dowód potwierdzający to twierdzenie Primary standard or official documentation supporting the adjacent article claim. Zakres: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Poziom ufności: wysoki · Zweryfikowano: Google: JavaScript redirects Przetwarzanie jest możliwe, ale nie jest gwarancją dokładnego czasu ani indeksowania. Dowód potwierdzający to twierdzenie Primary standard or official documentation supporting the adjacent article claim. Zakres: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Poziom ufności: wysoki · Zweryfikowano: Google: Redirects and Search
Przekierowanie JavaScript nawiguje przeglądarkę do nowego adresu URL za pomocą kodu po stronie klienta. Typowe metody i ich różnice:
window.location.replace("url")— nawiguje i usuwa oryginalny adres URL z historii sesji. To jest ta do użycia: przycisk wstecz pomija źródło przekierowania zamiast odsyłać użytkownika z powrotem.window.location.href = "url"— nawiguje, ale zachowuje oryginał w historii, więc przycisk wstecz wraca do strony przekierowującej (i może tworzyć pętlę).document.location.hrefiwindow.location.assign("url")działają tak samo.history.pushState()/history.replaceState()— nie są przekierowaniami. Przepisują pasek adresu bez żadnej nawigacji ani sygnału HTTP, więc roboty indeksujące nie traktują ich jako przekierowań. SPA używają ich do zmian adresów URL w aplikacji; potrzebują prawdziwych linków<a href>(lub rzeczywistych nawigacji), aby były indeksowalne.
Istotna granica: .replace(), .href i .assign() wszystkie wyzwalają
prawdziwą nawigację dokumentu (różnica między nimi dotyczy tylko tego, co dzieje się z
historią sesji), podczas gdy pushState()/replaceState() nigdy nie nawigują —
dotykają stanu historii i paska adresu i niczego więcej. Żadna z tych czterech metod
nie jest HTTP 301; “przekierowanie” tutaj to skrót dla nawigacji po stronie klienta, a nie kod
statusu.
Meta refresh (<meta http-equiv="refresh" content="0;url=...">) jest często
łączone z przekierowaniami JS, ale to dyrektywa HTML parsowana przed uruchomieniem JavaScript
— osobna, bardziej niezawodna kategoria, omówiona poniżej.
Jak Google przetwarza przekierowanie JavaScript
To jest sedno. Potok Google działa etapami, a przekierowanie JS i przekierowanie po stronie serwera są wykrywane na różnych etapach:
- Crawl — Googlebot pobiera adres URL i czyta surowy HTML. Przekierowanie po stronie serwera 301/302/307/308 jest widoczne tutaj.
- Kolejka renderowania — strony zwracające
200czekają na renderowanie. Dokumentacja Google zauważa: “may stay on this queue for a few seconds, but it can take longer than that.” (tłumaczenie) „może pozostać w tej kolejce przez kilka sekund, ale czasem trwa to dłużej”. Google nie publikuje stałego harmonogramu na poziomie usługi poza tym, więc traktuj oczekiwanie jako nieprzewidywalne — może być szybkie lub się przeciągać — zamiast zakładać konkretną liczbę dni lub tygodni. - Renderowanie + indeksowanie — headless Chromium uruchamia JavaScript. To jest pierwszy moment, w którym przekierowanie JS istnieje z punktu widzenia Google.
Ta sama idea, którą przedstawiam w Crawling i w JavaScript SEO, ma tutaj zastosowanie: renderowanie to osobny krok od pobierania, a wszystko, co od niego zależy, dziedziczy to opóźnienie i to ryzyko.
A ryzyko jest realne. Google zastrzega, że nie każdy pobrany adres uda się wyrenderować, więc przekierowanie JavaScript może pozostać niewidoczne, jeśli renderowanie zawiedzie. (Google Search Central) W oknie przed przetworzeniem przekierowania — i na zawsze, jeśli renderowanie się nie powiedzie — Google może utrzymywać pustą stronę źródłową w swoim indeksie.
Oficjalna kolejność preferencji Google
Dokumentacja przekierowań przedstawia hierarchię od najbardziej do najmniej niezawodnych:
- Przekierowania po stronie serwera — 301/308 (stałe), 302/307 (tymczasowe). Najlepsze dla wszystkiego: widziane w czasie indeksowania, jednoznaczne.
- Meta refresh — na poziomie HTML. 0-sekundowy meta refresh jest traktowany jako stałe przekierowanie (jak 301); każdy opóźniony meta refresh jest traktowany jako tymczasowe.
- Przekierowania JavaScript — ostateczność.
Google zaleca używanie przekierowań JavaScript dopiero wtedy, gdy nie da się zastosować przekierowania po stronie serwera ani odświeżenia meta. Stałe przekierowania przekazują sygnał kanoniczny do celu; tymczasowe utrzymują oryginał w wynikach. (Jak to współdziała z wyborem kanonicznym, opisano w Kanonalizacja).
Czy link equity przechodzi dalej?
Własna dokumentacja przekierowań Google wymienia nawigację lokalizacji JavaScript wśród stałych metod przekierowań i mówi, że cel staje się sygnałem kanonizacji, gdy Google go zinterpretuje — więc płaskie twierdzenie “JS redirects don’t pass PageRank” (tłumaczenie) „przekierowania JS nie przekazują PageRank” jest fałszywe. To, czego dokumentacja nie ustala, to że wynik jest identyczny, natychmiastowy lub tak niezawodny jak 301 po stronie serwera — opisuje sygnał kanoniczny, a nie gwarancję zgodnego przepływu PageRank, rankingu czy czasu. Uczciwe ujęcie: 301 przekazuje sygnał w czasie indeksowania z niemal pewnością; przekierowanie JS przekazuje go tylko wtedy i tylko jeśli renderowanie się powiedzie, a Google nie obiecuje, że wynik będzie dokładnie taki sam jak w przypadku 301. Ta luka — nie utracone equity — jest prawdziwym kosztem wyboru JavaScript.
To także dlatego przekierowania JS nie są same w sobie wyzwalaczem kary. Stają się problemem spamerskim tylko wtedy, gdy są używane do cloakingu — pokazywania robotom jednej strony i przekierowywania użytkowników do czegoś innego lub wysyłania użytkowników mobilnych do niepowiązanej domeny. Polityka Google dotycząca ukrytych przekierowań dotyczy tego zamiaru, a nie techniki.
Kiedy przekierowanie JavaScript jest właściwym narzędziem
Istnieją uzasadnione przypadki:
- Ograniczone platformy. Niektóre współdzielone hostingi, CDN lub konfiguracje CMS nie dają ci dostępu do reguł przekierowań po stronie serwera. Przekierowanie JS to ważny fallback — i co istotne, Google używał przekierowań JS na swoim blogu Webmaster, ponieważ, jak ujął to Gary Illyes, “that was the only thing we could use for 1:1 redirects, and it works on Google” (tłumaczenie) „to była jedyna rzecz, której mogliśmy użyć do przekierowań 1:1, i działa na Google” (OnCrawl).
- Obsługa błędów w SPA. Google wprost popiera przekierowanie JavaScript do adresu, pod którym serwer zwraca kod HTTP
404. (Google Search Central) Aplikacja jednostronicowa, która rozwiązuje złą trasę, może przekierować do prawdziwego punktu końcowego 404, aby Google poprawnie przetworzył błąd zamiast indeksować miękki 404.
W przypadku stałych migracji URL to nie jest narzędzie — użyj 301. Ten sam punkt podnoszę w migracjach stron: przekierowania JavaScript to ostateczność, a Google może ich nigdy nie zobaczyć.
Generatory statycznych stron: pułapka aliasów Hugo
Częstym zaskoczeniem jest to, że frontmatter aliases: w Hugo historycznie generował strony HTML z meta odświeżeniem, a nie przekierowania 301 po stronie serwera — a inne generatory statyczne robiły podobne rzeczy domyślnie. Domyślne ustawienia generatorów zmieniają się między wersjami, więc sprawdź faktyczne wyjście swojej aktualnie wdrożonej wersji, zamiast zakładać; jeśli aliases: nie daje Ci przekierowań 301, potrzebujesz reguł przekierowań na poziomie platformy (Netlify _redirects, Cloudflare Workers, Vercel vercel.json) oraz (w Hugo) disableAliases: true. Omawiam to szczegółowo w Hugo SEO.
Najlepsze praktyki wdrożeniowe
Jeśli przekierowanie JavaScript jest naprawdę Twoją jedyną opcją:
- Użyj
window.location.replace(), a nie.href. Jak ujmuje to Search Engine Journal, przekierowania JS “typically usewindow.location.replace()function rather thanwindow.location.hrefto avoid UX redirect loops” (tłumaczenie) „zazwyczaj używają funkcjiwindow.location.replace()zamiastwindow.location.href, aby uniknąć pętli przekierowań UX” (SEJ). - Umieść je w
<head>, a nie w<body>. Przeglądarki analizują HTML sekwencyjnie i uruchamiają skrypty, gdy na nie trafią, więc “position JavaScript redirects in the<head>tag rather than<body>to minimize delay” (tłumaczenie) „umieść przekierowania JavaScript w tagu<head>zamiast w<body>, aby zminimalizować opóźnienie” (OnCrawl). - Przekieruj do miejsca docelowego w jednym skoku. Przekierowanie JS na stronę, która sama przekierowuje gdzie indziej za pomocą 301, tworzy łańcuch; łańcuchy marnują budżet indeksowania i mogą pojawić się w GSC jako błąd przekierowania.
- Usuń URL źródłowy ze swojej mapy witryny XML. Mapy witryn powinny zawierać kanoniczne, indeksowalne URL-e — a nie te, które przekierowują.
- Przekieruj wewnętrzne linki do miejsca docelowego, aby nie przechodziły przez przekierowanie w ogóle.
- Upewnij się, że Googlebot może pobrać JS. Jeśli przekierowanie znajduje się w zewnętrznym skrypcie zablokowanym przez
robots.txt, Google nie może go wyrenderować i nie zobaczy przekierowania.
Jak wykrywać przekierowania JavaScript
Nie ogłaszają się jak 301 w nagłówku, więc musisz renderować:
- Crawler z włączonym renderowaniem JS. OnCrawl zaleca indeksowanie z “JavaScript rendering enabled (5-second timeout minimum)” (tłumaczenie) „włączonym renderowaniem JavaScript (minimalny limit czasu 5 sekund)”; Screaming Frog i Ahrefs Site Audit mogą oba renderować. Bez renderowania strona z przekierowaniem JS wygląda po prostu jak normalne
200. - Chrome DevTools. Zakładka Network (z włączoną opcją „Preserve log”) pokazuje nawigację po stronie klienta; rozszerzenie Redirect Path również ją oznacza.
- W Search Console pomyślnie przetworzone przekierowanie JS pojawia się w sekcji Strona z przekierowaniem — ten sam status co każdy przekierowany URL, co jest normalne dla źródeł niekanonicznych. Ta etykieta nie jest jednak gwarantowana przy każdym sprawdzeniu: odzwierciedla to, co Google pobrało, wyrenderowało, zinterpretowało i skanonizowało w danym momencie próbkowania, więc URL może pokazywać inny status (lub jeszcze żaden status przekierowania) między sprawdzeniami, bez błędu z Twojej strony.
Co bym faktycznie zrobił
Najpierw po stronie serwera, za każdym razem. Meta odświeżenie (0 sekund), gdy możesz edytować HTML, ale nie konfigurację serwera. JavaScript tylko wtedy, gdy obie opcje są niedostępne — i wtedy z window.location.replace() w <head>, czystą mapą witryny i sprawdzeniem, że przekierowanie faktycznie renderuje się dla Googlebota. W przypadku czegokolwiek trwałego lub o wysokiej wartości, dodatkowa niezawodność 301 jest warta prawie każdego wysiłku, aby ją uzyskać.
Podsumowanie AI
Skrócona wersja wersji zaawansowanej:
- Przekierowanie JavaScript jest po stronie klienta (
window.location.replace(),.href,.assign()). Jest przetwarzane dopiero po renderowaniu — faza trzecia procesu crawl → render → index — podczas gdy przekierowanie 301 po stronie serwera jest widziane w czasie crawl. - Kolejka renderowania jest ryzykiem: strona “może pozostać w tej kolejce przez kilka sekund, ale może to potrwać dłużej”, bez ustalonego harmonogramu na poziomie usługi, a renderowanie może całkowicie zawieść, w takim przypadku Google może nigdy nie zobaczyć przekierowania i utrzymać źródłową stronę w indeksie.
- Kolejność preferencji Google: po stronie serwera (301/302/307/308) → meta refresh → JavaScript. Dokumentacja: “Używaj przekierowań JavaScript tylko wtedy, gdy nie możesz zastosować przekierowań po stronie serwera lub meta refresh.”
- Cel staje się sygnałem kanonizacji, gdy Google zinterpretuje przekierowanie JS — więc mit “przekierowania JS nie przekazują PageRank” jest fałszywy — ale Google nie dokumentuje, że wynik dokładnie odpowiada przepływowi PageRank, rankingowi czy czasowi przekierowania po stronie serwera. Przekierowania JS nie są wyzwalaczem kary, chyba że są używane do cloakingu (ukrytych przekierowań).
- Legalne zastosowania: ograniczone platformy (Google sam ich używał na swoim blogu) oraz strony błędów SPA, które przekierowują na prawdziwy 404 (popierane przez Google).
- Meta refresh ≠ przekierowanie JS: to poziom HTML; 0s = stałe, każde opóźnienie =
tymczasowe.
history.pushState()/replaceState()nie są przekierowaniami — brak sygnału HTTP, crawlerzy ich nie śledzą. - Hugo
aliases:to meta refresh, nie 301 — częsta pułapka na generatorach statycznych. - Implementacja:
window.location.replace()w<head>, pojedynczy przeskok do celu, usuń źródło z sitemap, zmień linki wewnętrzne, upewnij się, że Googlebot może pobrać JS. - Wykrywanie: indeksowanie z włączonym renderowaniem JS, narzędzia deweloperskie Chrome lub rozszerzenie Redirect Path, status „Strona z przekierowaniem” w GSC.
Oficjalna dokumentacja
Podstawowe wskazówki dotyczące przekierowań i JavaScriptu.
- Przekierowania a wyszukiwarka Google — hierarchia preferencji (po stronie serwera → meta refresh → JavaScript), obsługa stałych vs. tymczasowych oraz zasady opóźnień meta refresh.
- Podstawy SEO dla JavaScriptu — potok renderowania i popierany przypadek użycia przekierowania SPA-404.
- Rozwiązywanie problemów z JavaScriptem w wyszukiwarce — miękkie 404, renderowanie i debugowanie JS, którego Google nie może przetworzyć.
- Ukryte przekierowania w zasadach dotyczących spamu — kiedy przekierowanie staje się cloakingiem i naruszeniem polityki.
Bing / Microsoft
- Pomoc dla webmasterów Bing — punkt wejścia do aktualnych wskazówek Bing. (W momencie pisania Bing nie miał dedykowanej strony pomocy dotyczącej przekierowań pod stałym adresem URL; Bingbot renderuje JavaScript mniej niezawodnie niż Googlebot, co sprawia, że przekierowania tylko JS są bardziej ryzykowne dla indeksacji w Bing.)
Cytaty ze źródła
Oficjalne oświadczenia Google i osób pracujących nad wyszukiwarką. Każdy link do dokumentacji Google to link bezpośredni, który przeskakuje do cytowanego fragmentu.
Google — kolejność preferencji i ryzyko renderowania
- “Only use JavaScript redirects if you can’t do server-side or meta refresh redirects.” (tłumaczenie) „Używaj przekierowań JavaScript tylko wtedy, gdy nie możesz zastosować przekierowań po stronie serwera ani odświeżenia meta.” — dokumentacja Google Search Central. Przejdź do cytatu
- “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.” (tłumaczenie) „Chociaż Google próbuje wyrenderować każdy adres URL pobrany przez Googlebota, renderowanie może się nie udać z różnych powodów. Oznacza to, że Google może nigdy nie zobaczyć przekierowania JavaScript, jeśli renderowanie treści się nie powiedzie.” — dokumentacja Google Search Central. Przejdź do cytatu
Google — popierany przypadek użycia SPA
- “Use a JavaScript redirect to a URL for which the server responds with a
404HTTP status code (for example/not-found).” (tłumaczenie) „Użyj przekierowania JavaScript do adresu URL, dla którego serwer odpowiada kodem statusu HTTP404(na przykład/not-found).” — dokumentacja Google Search Central. Przejdź do cytatu
Gary Illyes, Google
- Ogólnie o przekierowaniach JS: “Js redirects are probably not a good idea though.” (tłumaczenie) „Przekierowania JS prawdopodobnie nie są jednak dobrym pomysłem.” (8 lipca 2020)
- O tym, że Google i tak ich używa, gdy nic innego nie zadziałało: “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.” (tłumaczenie) „Użyliśmy przekierowań JS na webmasters.googleblog.com, ponieważ to była jedyna rzecz, której mogliśmy użyć do przekierowań 1:1, i działa to w Google.” Zasięg
Search Engine Journal — wdrożenie i przekazywanie link equity
- “JavaScript redirects typically use
window.location.replace()function rather thanwindow.location.hrefto avoid UX redirect loops.” (tłumaczenie) „Przekierowania JavaScript zazwyczaj używają funkcjiwindow.location.replace()zamiastwindow.location.href, aby uniknąć pętli przekierowań UX.” Czytaj - “JavaScript redirects are not SEO-friendly and should be avoided when alternatives exist… Only implement JavaScript redirects when server-side alternatives are genuinely unavailable.” (tłumaczenie) „Przekierowania JavaScript nie są przyjazne dla SEO i należy ich unikać, gdy istnieją alternatywy… Wdrażaj przekierowania JavaScript tylko wtedy, gdy alternatywy po stronie serwera są naprawdę niedostępne.” Czytaj
Typy przekierowań — ściągawka
Kiedy Google je widzi i jak są traktowane
| Metoda | Kiedy Google ją widzi | Traktowana jako | Niezawodność |
|---|---|---|---|
Po stronie serwera 301 / 308 | Czas indeksowania | Stałe | Najwyższa |
Po stronie serwera 302 / 307 | Czas indeksowania | Tymczasowe | Najwyższa |
Meta refresh, 0 sekund | Czas parsowania HTML | Stałe | Wysoka |
Meta refresh, opóźnione (>0s) | Czas parsowania HTML | Tymczasowe | Wysoka |
| Przekierowanie JavaScript | Po renderowaniu | Podąża za nawigacją | Najniższa |
history.pushState() / replaceState() | — | To nie jest przekierowanie | n/d |
Metody przekierowań JavaScript
| Kod | Zachowanie historii | Używać? |
|---|---|---|
window.location.replace("url") | Usuwa źródło z historii | Tak — zalecane |
window.location.href = "url" | Zachowuje źródło (pętla przycisku wstecz) | Unikaj do przekierowań |
window.location.assign("url") | To samo co .href | Unikaj do przekierowań |
document.location.href = "url" | Alias dla .href | Unikaj do przekierowań |
Szybkie fakty
- Kolejność Google: po stronie serwera → meta refresh → JavaScript. Używaj JS tylko wtedy, gdy pierwsze dwa są niemożliwe.
- Po zinterpretowaniu cel przekierowania JS jest sygnałem kanonizacji — mit „przekierowania JS nie przekazują PageRank” jest fałszywy. Google nie dokumentuje tego wyniku jako identycznego z 301, więc realne ryzyko to opóźnienie / błąd renderowania, a nie udokumentowana kara PageRank.
- Przekierowania JS nie są karą, chyba że są używane do cloakingu.
- Hugo
aliases:= meta refresh, nie 301. - Przetworzone przekierowanie JS pojawia się jako „Page with redirect” w GSC.
Czy powinienem użyć przekierowania JavaScript? — lista kontrolna decyzji
Przejdź od góry do dołu; zatrzymaj się przy pierwszym „tak”.
- Czy mogę ustawić przekierowanie po stronie serwera
301/302/307/308? → Zrób to. Zatrzymaj się tutaj. - Czy mogę edytować HTML
<head>, ale nie konfigurację serwera? → Użyj 0-sekundowego meta refresh dla stałych przeniesień. Zatrzymaj się tutaj. - Żadne z powyższych nie jest możliwe (platforma z ograniczeniami) lub to strona błędu SPA, która powinna trafiać na prawdziwy 404? → Przekierowanie JavaScript jest akceptowalne. Kontynuuj.
Jeśli używasz przekierowania JavaScript
- Użyj
window.location.replace()(nie.href/.assign()). - Umieść skrypt w
<head>, tak wcześnie, jak to możliwe. - Przekieruj bezpośrednio do finalnego celu — bez łańcucha przez inne przekierowanie.
- Usuń źródłowy URL ze swojej mapy witryny XML.
- Przekieruj linki wewnętrzne do celu.
- Potwierdź, że JS przekierowania nie jest zablokowany w
robots.txt, aby Googlebot mógł go wyrenderować. - Nie pokazujesz robotom jednej strony, a użytkowników przekierowujesz gdzie indziej (cloaking).
- Zweryfikuj przez crawlowanie z włączonym renderowaniem JS i sprawdzenie „Page with redirect” w GSC.
Zalecane przekierowanie JavaScript
Umieść to w <head>, aby wykonało się jak najwcześniej w kolejności parsowania:
<head>
<script>
window.location.replace("https://example.com/new-page/");
</script>
</head>replace() to kluczowy wybór — usuwa przekierowujący URL z historii sesji,
więc przycisk wstecz nie cofa użytkownika bezpośrednio do przekierowania.
Meta odświeżenie 0-sekundowe (następna najlepsza opcja, gdy nie możesz zrobić po stronie serwera)
To nie JavaScript, ale właściwa alternatywa, gdy możesz edytować HTML, a nie konfigurację serwera. Opóźnienie 0 sekund jest traktowane przez Google jako przekierowanie trwałe:
<head>
<meta http-equiv="refresh" content="0; url=https://example.com/new-page/">
</head>Czego NIE używać jako przekierowania
history.pushState() przepisuje pasek adresu, ale nie wykonuje nawigacji i
nie wysyła żadnego sygnału HTTP — roboty indeksujące nie podążą za nim:
// NOT a redirect — only changes the URL bar, no navigation happens
history.pushState({}, "", "/new-page/");Jeśli potrzebujesz, aby zmiana trasy w SPA była indeksowalna, daj jej prawdziwy link <a href> lub
prawdziwą nawigację, a nie tylko wywołanie History API.
Strona błędu SPA → prawdziwy 404 (wzorzec zatwierdzony przez Google)
Gdy aplikacja jednostronicowa rozpozna nieznaną trasę, wyślij ją do punktu końcowego, który
zwraca rzeczywisty 404, aby Google przetworzył błąd zamiast miękkiego 404:
// On an unresolved route in your SPA:
window.location.href = "/not-found"; // /not-found must return HTTP 404 Narzędzia do znajdowania i sprawdzania przekierowań JavaScript
- Screaming Frog — włącz renderowanie JavaScript (z odpowiednim
limitem czasu renderowania), aby strony z przekierowaniami JS nie wyglądały jak zwykłe
200. - Audyt witryny Ahrefs — renderuje strony i pokazuje przekierowania, łańcuchy oraz przekierowane linki wewnętrzne.
- Narzędzia deweloperskie Chrome — karta sieci — włącz „Zachowaj dziennik” i obserwuj, jak nawigacja po stronie klienta jest wyzwalana.
- Rozszerzenie Redirect Path do Chrome — oznacza przekierowania po stronie klienta obok tych po stronie serwera w szybkim wyskakującym oknie.
- Google Search Console — sprawdzanie adresu URL — zobacz, jak pojedynczy URL został przeszukany i wyrenderowany oraz czy Google trafił na status „Strona z przekierowaniem”.
- GSC — raport indeksowania stron — status „Strona z przekierowaniem” listuje przekierowane URL-e; „Błąd przekierowania” pokazuje łańcuchy i pętle.
Błędy, których należy unikać przy przekierowaniach JavaScript
- Używanie
window.location.href(lub.assign()) zamiast.replace()..hrefpozostawia przekierowywaną stronę w historii sesji, więc przycisk wstecz przenosi użytkownika z powrotem do przekierowania — pętla. Zamiast tego: użyjwindow.location.replace(), które usuwa źródło z historii. - Sięganie po przekierowanie JS przy stałej, ważnej migracji, gdy dostępne jest 301. Przekierowania JS są przetwarzane dopiero po renderowaniu, które może być opóźnione lub całkowicie zawieść — zbyt duże ryzyko dla strony, która ma znaczenie. Zamiast tego: użyj 301 po stronie serwera; JavaScript zostaw dla ograniczonych platform i stron błędów SPA.
- Łączenie przekierowania JS z kolejnym przekierowaniem zamiast trafiania do finalnego celu w jednym skoku. Łańcuchy marnują budżet indeksowania i mogą pojawić się jako błąd przekierowania w GSC. Zamiast tego: skieruj przekierowanie JS bezpośrednio na docelowy URL.
- Pozostawianie źródłowego URL w mapie XML. Mapy witryn powinny zawierać kanoniczne, indeksowalne URL-e, a nie przekierowujące. Zamiast tego: usuń źródło z mapy witryny, gdy przekierowanie jest aktywne.
- Blokowanie przez
robots.txtskryptu, który uruchamia przekierowanie. Jeśli Googlebot nie może pobrać JS, nie może wyrenderować przekierowania, a strona źródłowa może pozostać zindeksowana w nieskończoność. Zamiast tego: upewnij się, że skrypt jest dostępny dla crawlerów — tester robots.txt sprawdza dokładnie to. - Zakładanie, że
aliases:w frontmatter Hugo daje 301. Historycznie generował stronę HTML z meta odświeżaniem, a nie przekierowanie po stronie serwera — zweryfikuj faktyczne wyjście swojej wdrożonej wersji, zamiast zakładać. Zamiast tego: użyj reguł przekierowań na poziomie platformy (Netlify_redirects, Cloudflare Workers, Vercelvercel.json) orazdisableAliases: true, jak opisano w SEO dla Hugo. - Traktowanie
history.pushState()/replaceState()jako przekierowania. One tylko zmieniają pasek adresu — brak nawigacji, brak sygnału HTTP, a crawlerzy ich nie śledzą. Zamiast tego: użyj prawdziwego linku<a href>lub faktycznej nawigacji dla wszystkiego, co ma być indeksowalne. - Pokazywanie crawlerom jednej strony, a użytkownikom wysyłanie gdzie indziej (cloaking). To właśnie zamienia legalne przekierowanie JS w naruszenie zasad ukrytych przekierowań — chodzi o intencję, nie technikę. Zamiast tego: wysyłaj wszystkich, w tym boty, do tego samego celu.
Częste problemy z przekierowaniami JavaScript
Źródłowy URL pozostaje zindeksowany długo po wdrożeniu przekierowania
- Prawdopodobna przyczyna: strona wciąż czeka w kolejce renderowania Google lub renderowanie całkowicie zawiodło.
- Naprawa + sprawdzenie: uruchom test na żywo w narzędziu URL
Inspection w Google Search Console dla źródłowego URL. Jeśli strona nie została jeszcze wyrenderowana, poczekaj — Google
nie podaje stałego czasu dla kolejki renderowania, więc sprawdzaj okresowo, zamiast
zakładać konkretny przedział. Jeśli renderowanie nadal zawodzi, potwierdź, że
skrypt przekierowania nie jest zablokowany (patrz problem z
robots.txtponiżej).
Przycisk wstecz wraca bezpośrednio do przekierowującej strony
- Prawdopodobna przyczyna: przekierowanie używa
window.location.hreflub.assign()zamiast.replace(), więc źródłowy URL pozostaje w historii sesji. - Naprawa + sprawdzenie: zmień skrypt na
window.location.replace(). Potwierdź, lądując na stronie docelowej i naciskając wstecz — powinno całkowicie pominąć źródło przekierowania.
GSC pokazuje „Crawled – currently not indexed” zamiast „Page with redirect”
- Prawdopodobna przyczyna: Google nie wyrenderował jeszcze strony lub renderowanie kończy się niepowodzeniem dla tego adresu URL.
- Poprawka + sprawdzenie: przeszukaj adres URL za pomocą crawlera z renderowaniem JS (Screaming Frog lub
Ahrefs Site Audit, z włączonym renderowaniem), aby potwierdzić, że przekierowanie faktycznie działa
po stronie klienta. Sprawdź również, czy skrypt przekierowujący nie jest zablokowany w
robots.txt— tester robots.txt potwierdza, czy Googlebot może go pobrać.
Nierozwiązana trasa SPA pojawia się jako miękki błąd 404 w GSC
- Prawdopodobna przyczyna: trasa przekierowuje gdzieś, ale miejsce docelowe nie
zwraca faktycznie statusu HTTP
404. - Poprawka + sprawdzenie: skieruj przekierowanie na punkt końcowy, który naprawdę odpowiada
kodem
404(wzorzec zalecany przez Google), a następnie uruchom ponownie URL Inspection, aby zobaczyć zmianę statusu z miękkiego 404 na czyste 404.
Strona przekierowująca przez JS nadal wygląda jak zwykłe 200 w raporcie crawl
- Prawdopodobna przyczyna: crawler działał bez włączonego renderowania JavaScript, więc zobaczył tylko początkową odpowiedź HTML, a nie nawigację po stronie klienta.
- Poprawka + sprawdzenie: przeszukaj ponownie z włączonym renderowaniem JS (minimalny limit czasu 5 sekund to rozsądny punkt wyjścia) i potwierdź, że przekierowanie teraz się pojawia.
Udowodnienie, że przekierowanie faktycznie zadziałało
| Test do wykonania | Oczekiwany wynik | Interpretacja niepowodzenia | Okno monitorowania | Wyzwalacz wycofania |
|---|---|---|---|---|
| tester robots.txt na adresie URL skryptu przekierowującego | Skrypt jest dozwolony dla Googlebota | Zabroniony — Google nie może pobrać skryptu, więc nigdy nie wyrenderuje przekierowania | Natychmiast | Napraw lub usuń blokującą regułę robots.txt przed poleganiem na przekierowaniu |
| Przeszukaj źródłowy adres URL z włączonym renderowaniem JS (Screaming Frog / audyt witryny Ahrefs) | Crawler raportuje nawigację po stronie klienta do zamierzonego miejsca docelowego | Strona nadal raportuje zwykłe 200 bez nawigacji — renderowanie nie działa | Natychmiast (pojedyncze indeksowanie) | Jeśli nadal nie działa po naprawieniu robots.txt, użyj meta odświeżenia 0-sekundowego lub przekierowania po stronie serwera |
| Sprawdzanie adresu URL w GSC — test aktywnej wersji na źródłowym adresie URL | Wyrenderowany wynik pokazuje przekierowanie wykonujące się do miejsca docelowego | Renderowanie kończy się niepowodzeniem lub wyrenderowany HTML nie pokazuje nawigacji | Natychmiast dla samego testu | Jeśli test wielokrotnie nie renderuje, potraktuj tę platformę jako niezdolną do obsługi przekierowania JS — uzyskaj dostęp do serwera lub użyj meta odświeżenia |
| GSC — raport indeksowania stron dla źródłowego adresu URL | Źródłowy adres URL jest wymieniony pod statusem „Strona z przekierowaniem” | Nadal pokazuje jako zindeksowany, „Pobrano — obecnie niezindeksowana” lub zduplikowaną treść | 2–4 tygodnie (status indeksowania aktualizuje się według harmonogramu Google) | Jeśli nadal nie jest sklasyfikowany jako przekierowanie po 4+ tygodniach, wróć do powyższych kontroli blokowania renderowania |
| Ręczne sprawdzenie przycisku wstecz w przeglądarce po dotarciu do miejsca docelowego | Przycisk wstecz całkowicie pomija źródłową stronę | Przycisk wstecz wraca do źródłowej strony | Natychmiast | Zmień skrypt z .href/.assign() na window.location.replace() |
Sprawdź się: Przekierowania JavaScript
Pięć szybkich pytań o to, jak działają przekierowania JavaScript i kiedy ich używać. Wybierz odpowiedź na każde, a następnie sprawdź.
Zasoby warte Twojego czasu
Moje powiązane teksty
- Problemy i dobre praktyki w SEO dla JavaScriptu — strona renderowania, dlatego przekierowania JS niosą ryzyko czasowe.
- Przewodnik dla początkujących po technicznym SEO — gdzie przekierowania i renderowanie wpisują się w szerszy obraz.
Moje wystąpienia
- Jak działa wyszukiwarka (SlideShare) — moje omówienie pobierania, renderowania, indeksowania i rankingu — potoku, który czyni przekierowanie JS wydarzeniem trzeciej fazy. (Zastrzeżenie: to moje rozumienie systemów, więc opis nie będzie w 100% kompletny ani dokładny.)
Z branży
- Przekierowania a wyszukiwarka Google (Google Search Central) — oficjalna hierarchia preferencji oraz obsługa przekierowań stałych i tymczasowych.
- Ukryte przekierowania (Google Search Central) — linia polityki antyspamowej oddzielająca legalne przekierowanie od cloakingu.
- Przekierowania JavaScript a SEO: kiedy i jak ich używać (Search Engine Journal) — praktyczne wskazówki wdrożeniowe oraz rozróżnienie między
replace()a.href. - Czy przekierowania JavaScript są przyjazne dla SEO? (Search Engine Journal) — podsumowanie „unikaj, gdy istnieją alternatywy”.
- Przekierowania JavaScript a SEO: kompletny przewodnik (OnCrawl) — wskazówki dotyczące umieszczania w nagłówku, narzędzia do wykrywania oraz pełny cytat Gary’ego Illyesa.
- Czy przekierowania JavaScript szkodzą SEO? (Conductor) — zwięzła odpowiedź w formacie FAQ na zapytanie informacyjne.
- Przewodnik po typach przekierowań (Lumar) — szersza taksonomia przekierowań z uwzględnieniem przekierowań JS w kontekście.
Dziennik zmian
Zaktualizowano 18 lip 2026.
Podsumowanie redakcyjne i zapisane szczegóły zmian.Szczegóły zmian
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
Pełne porównanie jest niedostępne — dla tej wersji nie zarchiwizowano wcześniejszej migawki.