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.
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ę:
- HTTP 301 i 308 - przekierowania stałe po stronie serwera.
- Meta refresh z zerowym opóźnieniem i jego odpowiednik w nagłówku HTTP
Refresh- Google traktuje je jako stałe. - Przekierowanie JavaScript przez
window.location- tylko gdy nie da się inaczej, bo Google musi wyrenderować stronę, a to nie zawsze się udaje. - 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
wwwnawww, 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
| Zadanie | Reguła w .htaccess |
|---|---|
Usunięcie .html z adresów | RewriteRule ^(.+)\.html$ /$1 [R=301,L] |
| Dodanie ukośnika na końcu | RewriteRule ^([^.]+[^/])$ /$1/ [R=301,L] |
| Zmiana katalogu z zachowaniem reszty | RewriteRule ^produkty/(.*)$ /sklep/$1 [R=301,L] |
| Stary identyfikator na nowy slug | RewriteRule ^p/123$ /sklep/ekspres-x/ [R=301,L] |
| Usunięcie parametru śledzącego | RewriteCond %{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łąd | Skutek |
|---|---|
Łańcuch: stary adres na HTTP, potem na HTTPS, potem na www | Trzy 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 zmianie | Stary 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 404 | Robot dochodzi do błędu, strona wypada z indeksu |
Cel przekierowania z noindex | Stary adres znika, a nowy nie wchodzi do indeksu |
| Przekierowanie tylko w JavaScript | Google może go nigdy nie wykonać |
| Usunięcie przekierowań po kilku miesiącach | Linki 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.
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