Przekierowanie 301 (stałe)

Przekierowanie 301 to odpowiedź serwera, która mówi przeglądarce i robotowi: ta strona na stałe zmieniła adres, idź pod nowy. Google traktuje 301 jako mocny sygnał, że stroną kanoniczną ma być cel przekierowania, i pokazuje w wynikach nowy adres. Ustawia się je po stronie serwera: w .htaccess, w konfiguracji nginx, w regułach CDN albo w kodzie aplikacji.

Przekierowanie 301 to odpowiedź HTTP, która na stałe kieruje użytkownika i robota ze starego adresu na nowy. Google uznaje wtedy cel przekierowania za stronę kanoniczną i pokazuje go w wynikach zamiast starego adresu.

Jak wygląda

Odpowiedź serwera na żądanie starego adresu:

HTTP/1.1 301 Moved Permanently

Location: https://www.example.com/nowy-adres/

Przeglądarka od razu prosi o adres z nagłówka Location. Treść odpowiedzi 301 nikogo nie interesuje: według dokumentacji Google (jak kody HTTP wpływają na roboty Google) wszystko, co Google otrzyma z adresu przekierowującego, jest ignorowane, a przetwarzana jest treść końcowego adresu docelowego.

Jak traktuje to Google

Dokumentacja Google (przekierowania a wyszukiwarka Google) dzieli je na stałe i tymczasowe. Przy stałych w wynikach pokazuje się strona docelowa, przy tymczasowych strona źródłowa. Googlebot śledzi przekierowanie stałe, a proces indeksowania traktuje je jako sygnał, że cel ma być kanoniczny. Google radzi używać przekierowań stałych tylko wtedy, gdy masz pewność, że nie zostaną cofnięte, i jako najpewniejszą metodę wskazuje przekierowanie po stronie serwera.

Ten sam dokument porządkuje typy według szansy na poprawną interpretację:

  1. HTTP 301 i 308 - przekierowania stałe po stronie serwera.
  2. Meta refresh z zerowym opóźnieniem i jego odpowiednik w nagłówku HTTP Refresh - Google traktuje je jako stałe.
  3. Przekierowanie JavaScript przez window.location - tylko gdy nie da się inaczej, bo Google musi wyrenderować stronę, a to nie zawsze się udaje.
  4. Link z informacją o przeprowadzce (przekierowanie „crypto”) - nie polegaj na nim.

Dokument o kodach stanu dodaje dwie liczby. Roboty Google śledzą domyślnie do 10 przeskoków przekierowania, a 308 jest odpowiednikiem 301, tak jak 307 odpowiednikiem 302 (jak kody HTTP wpływają na roboty Google). Wyszukiwarka traktuje kody z jednej grupy jednakowo, ale zaleca kod właściwy dla sytuacji, bo inni klienci je rozróżniają. Porównanie z przekierowaniem tymczasowym znajdziesz w haśle o przekierowaniu 301 i 302.

Przekierowanie to także najsilniejsza metoda wskazania adresu kanonicznego. Dokumentacja o duplikatach (jak określić kanoniczny URL) stawia je wyżej niż tag rel=canonical i radzi używać ich, gdy wycofujesz duplikat strony. Więcej w haśle o adresie kanonicznym.

Kiedy używać

  • zmiana adresu pojedynczej strony albo całej struktury adresów,
  • przeprowadzka na nową domenę,
  • ujednolicenie wersji: HTTP na HTTPS, bez www na www, bez ukośnika na z ukośnikiem,
  • usunięcie strony, która ma bliski odpowiednik,
  • połączenie dwóch serwisów.

Kiedy nie używać 301:

  • tymczasowa niedostępność strony - użyj 302 albo 503,
  • strona usunięta bez zamiennika - zostaw 404 albo 410,
  • test A/B z podmianą adresu - dokumentacja Google o testach zaleca przekierowanie tymczasowe (testy A/B a wyszukiwarka).

Jak ustawić

Apache (.htaccess)

Najprostsza forma przez mod_alias, przykład z dokumentacji Google:

Redirect permanent "/stary" "https://example.com/nowy"

Przekierowanie z wyrażeniem regularnym przez mod_rewrite wymaga włączonego silnika:

RewriteEngine On

RewriteRule ^uslugi$ /o-nas/uslugi [R=301,L]

Flaga R=301 ustawia kod, L kończy przetwarzanie reguł. Bez R=301 Apache zwróci 302.

nginx

Pojedynczy adres w bloku server:

location = /stary { return 301 https://example.com/nowy; }

Wzorzec dla całego katalogu:

rewrite ^/blog/(.*)$ /artykuly/$1 permanent;

Słowo permanent daje 301, redirect daje 302.

Cloudflare

W panelu domeny użyj reguł przekierowań (Rules, Redirect Rules). Reguła ma warunek, na przykład nazwę hosta albo ścieżkę, cel i kod stanu, który ustawiasz na 301. Przekierowanie wykonuje się na brzegu sieci, zanim żądanie dotrze do serwera.

WordPress

WordPress sam przekierowuje stary slug wpisu na nowy po zmianie adresu w edytorze. Własne przekierowania dodasz przez wtyczkę do przekierowań albo regułą w .htaccess powyżej bloku # BEGIN WordPress, żeby zadziałała przed regułami CMS.

PHP

Przykład z dokumentacji Google (przekierowania a wyszukiwarka Google), nagłówki muszą wyjść przed jakimkolwiek wyjściem na ekran:

header('HTTP/1.1 301 Moved Permanently');

header('Location: https://www.example.com/newurl');

exit();

Przekierowanie domeny, www i HTTPS

Trzy najczęstsze reguły globalne w .htaccess. Z HTTP na HTTPS:

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Z wersji bez www na www:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]

RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Ze starej domeny na nową, z zachowaniem ścieżki:

RewriteCond %{HTTP_HOST} ^(www\.)?stara-domena\.pl$ [NC]

RewriteRule ^(.*)$ https://nowa-domena.pl/$1 [R=301,L]

Obie reguły protokołu i hosta połącz w jedną, inaczej użytkownik z http://example.com/ przejdzie przez dwa skoki. Dokumentacja o przenoszeniu witryny (przenoszenie witryny ze zmianą adresów) zaleca trwałe przekierowania po stronie serwera ze starych adresów na nowe zgodnie z mapowaniem i utrzymanie ich najdłużej, jak to możliwe, zwykle co najmniej rok. Lista kroków jest w poradniku o migracji.

Przykłady reguł z regex

ZadanieReguła w .htaccess
Usunięcie .html z adresówRewriteRule ^(.+)\.html$ /$1 [R=301,L]
Dodanie ukośnika na końcuRewriteRule ^([^.]+[^/])$ /$1/ [R=301,L]
Zmiana katalogu z zachowaniem resztyRewriteRule ^produkty/(.*)$ /sklep/$1 [R=301,L]
Stary identyfikator na nowy slugRewriteRule ^p/123$ /sklep/ekspres-x/ [R=301,L]
Usunięcie parametru śledzącegoRewriteCond %{QUERY_STRING} ^utm_source= + RewriteRule ^(.*)$ /$1? [R=301,L]

Znak ? na końcu celu w ostatniej regule kasuje parametry zapytania. Bez niego Apache dokleiłby je do nowego adresu. Każdą regułę testuj na kilku adresach, bo zbyt szeroki wzorzec potrafi zapętlić serwis.

Najczęstsze błędy

BłądSkutek
Łańcuch: stary adres na HTTP, potem na HTTPS, potem na wwwTrzy skoki zamiast jednego, wolniej dla użytkownika i robota
Pętla przekierowańPrzeglądarka przerywa, Google zgłasza błąd przekierowania
302 zamiast 301 przy stałej zmianieStary adres zostaje w wynikach jako kanoniczny
Hurtowe przekierowanie na stronę głównąRyzyko soft 404, utrata kontekstu dla użytkownika
Przekierowanie na adres, który sam zwraca 404Robot dochodzi do błędu, strona wypada z indeksu
Cel przekierowania z noindexStary adres znika, a nowy nie wchodzi do indeksu
Przekierowanie tylko w JavaScriptGoogle może go nigdy nie wykonać
Usunięcie przekierowań po kilku miesiącachLinki z innych witryn znowu prowadzą do 404

Łańcuchy i pętle mają osobne hasło o łańcuchu i pętli przekierowań.

Jak sprawdzić

Jedno polecenie pokazuje kod i cel bez podążania za przekierowaniem:

curl -I https://example.com/stary-adres/

Z flagą -L i formatem wyjścia widać cały łańcuch:

curl -sIL -o /dev/null -w "%{http_code} %{redirect_url}\n" https://example.com/stary-adres/

W narzędziach deweloperskich przeglądarki (zakładka Sieć, z włączonym zachowywaniem logu) każdy skok pojawi się jako osobny wiersz ze swoim kodem.

W Search Console przekierowane adresy lądują w raporcie Indeksowanie stron jako Strona zawiera przekierowanie, a zepsute jako Błąd przekierowania. Dla wielu adresów naraz sprawdzarka przekierowań wypisze każdy skok z kodem, celem i nagłówkami oraz ostrzeże, gdy strona końcowa ma noindex albo zwraca błąd. Znaczenie pozostałych kodów opisuje hasło o kodach odpowiedzi HTTP.

Monitorowanie

IndexRise co noc pobiera monitorowane adresy i zapisuje kod odpowiedzi. Pojawienie się przekierowania na stronie, która odpowiadała 200, to zdarzenie krytyczne z celem i liczbą kroków, które zobaczysz następnego ranka; pętla przekierowań to osobne zdarzenie. Stare adresy po migracji i ich cele sprawdzisz sprawdzarką przekierowań. Po migracji to najszybszy sposób, żeby złapać regułę, która przestała działać po aktualizacji serwera.

Dobre przekierowanie 301 to jeden skok z kodem 301 na stronę, która odpowiada 200 i nie ma noindex. Wszystko inne to zadanie do naprawy.
Sprawdź to na swojej stronieSprawdzarka przekierowańCały łańcuch z kodami, celem i nagłówkami — do 10 adresów naraz.

Najczęściej zadawane pytania

Czy przekierowanie 301 traci moc linków?

Dokumentacja Google nie mówi o utracie. Opisuje 301 jako mocny sygnał, że cel ma być stroną kanoniczną, a sygnały dotyczące starego adresu konsolidują się na nowym. Nie podawaj liczb procentowych, bo Google ich nie publikuje.

Czym różni się 301 od 308?

Dla wyszukiwarki Google niczym: dokumentacja traktuje oba jako przekierowanie stałe. Różnica techniczna: przy 308 klient musi zachować metodę żądania, na przykład POST, a przy 301 może zmienić ją na GET.

Ile przekierowań w łańcuchu śledzi Google?

Według dokumentacji kodów stanu Googlebot domyślnie śledzi do 10 przeskoków, a potem przerywa. W praktyce każdy dodatkowy skok to opóźnienie dla użytkownika i ryzyko błędu, więc łącz przekierowania w jedno.

Jak długo trzymać przekierowanie 301 po migracji?

Dokumentacja Google o przenoszeniu witryny zaleca utrzymywać przekierowania najdłużej, jak to możliwe, zwykle co najmniej rok. Stare adresy pozostają w linkach z innych witryn, więc nie usuwaj ich po kilku miesiącach.

Czy przekierować wszystkie stare adresy na stronę główną?

Nie. Przekierowanie na stronę niezwiązaną z treścią Google może potraktować jak soft 404. Przekierowuj na najbliższy odpowiednik, a adresy bez odpowiednika zostaw na 404.

Czy przekierowanie przez wtyczkę jest gorsze od reguły w .htaccess?

Dla Google to to samo przekierowanie po stronie serwera, jeśli odpowiedź ma kod 301. Reguła w serwerze działa jednak szybciej, bo nie uruchamia całej aplikacji, i nie znika po dezaktywacji wtyczki.

Aktualizacja: 2026-10-20