$ curl /przekierowanie-301-redirect-301_

Przekierowanie 301 (Redirect 301) – jak działa i jak używać go w SEO

Piotr Cichosz @ 30 kwietnia 2026 11min

Przekierowanie 301 to nieodzowne narzędzie w zarządzaniu stronami internetowymi, umożliwiające trwałe przekierowanie jednego adresu URL na inny. Jest kluczowy w sytuacjach, gdy strona zmienia swoją strukturę, przenosi się na nową domenę lub przechodzi z HTTP na HTTPS. Jego główną zaletą jest przekazywanie „Link Juice” – wartości SEO oryginalnego adresu – do nowej lokalizacji, co pomaga w utrzymaniu pozycji strony w wynikach wyszukiwania.

  • Przekierowanie 301 umożliwia trwałe przekierowanie URL, zachowując wartość SEO.
  • Jest kluczowe przy zmianie struktury strony, domeny czy przejściu na HTTPS.
  • Unika błędów 404 i frustracji użytkowników, poprawiając doświadczenie na stronie.
  • Konfiguracja możliwa przez .htaccess, używając mod_alias lub mod_rewrite.

Do czego służą przekierowania 301?

Przekierowanie 301 to najbardziej znany rodzaj przekierowania. Liczba 301 odnosi się do leżącego u podstaw kodu statusu HTTP. Podczas gdy kod statusu 404 wskazuje, że żądany zasób nie może zostać znaleziony, kody z grupy 300 oznaczają przekierowania (ang. redirects). Ogólnie rzecz biorąc, przekierowania 301 służą do zapobiegania błędom 404.

Poniżej masz przegląd najważniejszych kodów statusu HTTP związanych z przekierowaniami:

Kod statusu HTTP Wyjaśnienie
200 OK Serwer znalazł zasób pod żądanym adresem i zwraca go.
301 Moved Permanently Zasób pod żądanym adresem jest trwale dostępny pod nowym adresem, który serwer zwraca. Stary adres nie jest już ważny.
302 Found Zasób pod żądanym adresem jest tymczasowo dostępny pod nowym adresem, który serwer zwraca. Stary adres może w przyszłości ponownie stać się ważny.
303 See Other Podobnie jak 302, jednak przy wywołaniu tymczasowego adresu dozwolone są wyłącznie żądania GET.
307 Temporary Redirect Podobnie jak 302; w odróżnieniu od 303 klient może zmienić metodę HTTP (GET, POST, PUT itp.) przy wywołaniu tymczasowego adresu.
404 Not Found Serwer nie może znaleźć żadnego zasobu pod żądanym adresem.

Przekierowanie 301 przy migracji treści

Treści internetowe, znane również jako zasoby, są przypisane do adresów internetowych. Czasami treści są migrowane, tzn. zawartość pozostaje ta sama, ale adres się zmienia. Ma to miejsce m.in. przy przejściu z HTTP na HTTPS, przy przenoszeniu witryny na nową domenę lub przy dostosowaniu struktury linków dla celów optymalizacji pod kątem wyszukiwarek. We wszystkich przypadkach chcemy uniknąć sytuacji, w której użytkownicy próbujący uzyskać dostęp do istniejących adresów trafiają w próżnię.

Przekierowania 301 w optymalizacji dla wyszukiwarek

Poza zmianami adresów treści internetowych przekierowania 301 są niezbędne dla optymalizacji pod kątem wyszukiwarek (SEO) i marketingu online. Przekierowania 301 są wykorzystywane do tworzenia istotnych dla SEO „pretty URL” i „canonical URL”.

Skracacze URL, popularne do udostępniania stron docelowych w mediach społecznościowych, wewnętrznie również bazują na przekierowaniach 301.

Dlaczego przekierowania 301 są tak ważne dla SEO? W odróżnieniu od spokrewnionych przekierowań 302, 303 i 307, tylko przekierowanie 301 przenosi „link juice” pierwotnego adresu na nowy adres. Jeśli wyszukiwarka zaindeksowała treść i oceniła ją pozytywnie, można zmienić adres za pomocą przekierowania 301 bez utraty tej oceny. Dzięki temu przekierowania 301 umożliwiają złożone strategie SEO, takie jak strategia wielu domen.

Jak działają przekierowania 301?

Przekierowania 301 są stosowane w komunikacji między serwerami internetowymi a klientami. Serwer informuje klienta, że żądany zasób nie jest już dostępny pod podanym adresem URL i przekazuje aktualnie obowiązujący adres. Klientem może być zarówno przeglądarka internetowa ludzkiego użytkownika, jak i bot wyszukiwarki.

  1. Klient próbuje uzyskać dostęp do zasobu pod danym adresem URL.
  2. Serwer odpowiada kodem statusu 301 „Moved Permanently” i przekazuje w nagłówku HTTP Location nowy adres URL dostępu do zasobu.
  3. Klient zapisuje nowy adres URL w pamięci podręcznej; kolejne żądania do starego adresu URL są od razu kierowane pod nowy adres.
  4. Klient próbuje pobrać zasób pod nowym adresem URL.

Proces ten można zilustrować za pomocą popularnego narzędzia sieciowego cURL. Wywołujemy stronę główną mojego bloga pod adresem http://highlab.pl i używamy opcji --head, aby wyświetlić nagłówek odpowiedzi HTTP:

➜  ~ curl --head http://highlab.pl
HTTP/1.1 301 Moved Permanently
Date: Thu, 30 Apr 2026 12:33:49 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
Location: https://highlab.pl/
Cache-Control: max-age=0
Expires: Thu, 30 Apr 2026 12:33:49 GMT
Server: Apache

Serwer highlab odpowiada kodem statusu HTTP „301 Moved Permanently”, a nagłówek Location zawiera nowy adres https://highlab.pl/. Jak widać, domena korzysta z protokołu HTTPS. Następnie do polecania cURL opcję --location, aby podążał za przekierowaniem 301:

➜  ~ curl --head --location http://highlab.pl
HTTP/1.1 301 Moved Permanently
Date: Thu, 30 Apr 2026 12:37:33 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
Location: https://highlab.pl/
Cache-Control: max-age=0
Expires: Thu, 30 Apr 2026 12:37:33 GMT
Server: Apache

HTTP/2 200
date: Thu, 30 Apr 2026 12:37:34 GMT
content-type: text/html; charset=UTF-8
vary: User-Agent
cache-control: max-age=0
expires: Thu, 30 Apr 2026 12:37:33 GMT
server: Apache
alt-svc: h3=":443"; ma=86400

Teraz cURL wyświetla nagłówki dwóch połączeń. Przy drugim wywołaniu serwer odpowiada kodem statusu „200 OK”; zasób został znaleziony, a treść jest przesyłana w ciele odpowiedzi. Ten sam proces zachodzi w tle w przeglądarce, gdy wpisuje się ten adres.

Definiowanie przekierowania 301 za pomocą pliku htaccess

Widzieliśmy, jaką rolę odgrywają przekierowania 301 w komunikacji między serwerem a klientem. Ale jak definiować przekierowania 301 na serwerze? Istnieje kilka podejść; jedno z najczęściej stosowanych polega na definiowaniu dyrektyw przekierowania w pliku htaccess serwera Apache. Aby to działało, odpowiednie moduły Apache muszą być aktywne:

Dyrektywy Moduł Apache Wyjaśnienie
Redirect mod_alias Proste przekierowania
Rewrite mod_rewrite Złożone przekierowania

Proste przekierowania 301 w pliku htaccess

Przyjrzyjmy się najpierw, jak definiować proste przekierowania 301 w pliku htaccess. Wykorzystamy do tego dyrektywy Redirect modułu mod_alias. Nadają się one do przekierowywania adresu URL na serwerze na inny adres URL. Schemat jest bardzo prosty:

Redirect 301 "/ścieżka_źródłowa" "docelowy_URL"

Przekierujmy najpierw adres URL na serwerze na inny wewnętrzny adres URL. Ukośnik na początku oznacza początek ścieżki URL, czyli część znajdującą się za domeną:

Redirect 301 "/stara.html" "/nowa.html"

Jeśli zamiast tego chcemy wskazać zewnętrzny adres URL jako cel, podajemy go jako miejsce docelowe:

Redirect 301 "/stara.html" "http://example.com/nowa.html"

Za pomocą dyrektywy Redirect można również definiować przekierowania 301 całych katalogów w pliku htaccess. Przekierowujemy wszystkie adresy URL zaczynające się od komponentu ścieżki „pl” na subdomenę:

Redirect 301 "/pl/" "http://pl.example.com/"

Według tego samego schematu można przekierować wszystkie adresy URL z jednej domeny na inną domenę:

Redirect 301 "/" "http://inna.example.com/"

Gdy chcemy przekierować wiele pojedynczych adresów zgodnych z określonym wzorcem, ręczne definiowanie kolejnych przekierowań szybko staje się uciążliwe. Wtedy sięgamy po spokrewnioną dyrektywę RedirectMatch. Używa ona wyrażenia regularnego do rozpoznawania wzorców i wyodrębniania ich fragmentów:

RedirectMatch 301 wyrażenie_regularne URL

Poniżej pokazujemy przykładowy wpis RedirectMatch, który wyodrębnia kategorię i ID artykułu z parametrów GET i przepisuje je do ścieżki:

RedirectMatch 301 "/article.php?cat=(.*)&id=(.*)" "/articles/$1/$2/"

Wyobraźmy sobie, że domeną jest example.com. Wówczas adres URL http://example.com/article.php?cat=web&id=42 zostałby przekierowany na http://example.com/articles/web/42/.

Złożone przekierowania 301 w pliku htaccess

Do tworzenia przekierowań 301 dla złożonych przypadków użycia wykorzystuje się dyrektywy Rewrite modułu Apache mod_rewrite. Pozwalają one definiować i sprawdzać warunki przekierowań, ustawiać i odczytywać zmienne środowiskowe oraz definiować reguły przekierowań przy użyciu wyrażeń regularnych.

Za pomocą mod_rewrite możliwe jest łańcuchowanie reguł przekierowania; moduł dostarcza quasi mini-język programowania do przekształcania adresów URL i wyzwalania przekierowań. Należy przy tym zachować ostrożność, ponieważ nieprawidłowe użycie może powodować nieskończone pętle.

Dyrektywy Rewrite zaczynają się od linii RewriteEngine on. Po niej następują opcjonalne warunki przekierowania RewriteCond, a na końcu jedna lub więcej reguł przekierowania RewriteRule. Zachowanie warunków i reguł przekierowania można modyfikować za pomocą opcji zwanych „flagami”. Aby wywołać przekierowanie 301, jedna z reguł musi zawierać flagi L,R=301:

RewriteEngine on
RewriteCond TestString CondPattern [flags]
RewriteRule URL_path Substitution [L,R=301]

W ramach reguł i warunków przekierowania dostępnych jest wiele zmiennych nagłówka i serwera w postaci %{HTTP_HOST}, %{REQUEST_URI} itp. Można je łączyć za pomocą operatorów i przetwarzać przy użyciu funkcji. Dzięki temu można zrealizować praktycznie każde żądane przekierowanie, choć składnia nie jest zbyt intuicyjna.

Przyjrzyjmy się przykładowi przekierowania 301 za pomocą mod_rewrite. Chcemy wymusić dla naszej witryny kanoniczne adresy URL w celu uniknięcia powielania treści. Oznacza to, że wszystkie adresy URL powinny zaczynać się od HTTPS i WWW, niezależnie od tego, w jaki sposób odwiedzający uzyskują dostęp do treści.

Definiujemy dwa warunki przekierowania, które łączymy flagą OR. Pierwszy warunek sprawdza, czy HTTPS jest wyłączone, drugi weryfikuje, czy domenie brakuje poprzedzającego WWW. Za pomocą flagi NC wyłączamy rozróżnianie wielkości liter. Jeśli jeden z warunków jest spełniony, przekierowujemy za pomocą przekierowania 301 na wersję HTTPS-WWW adresu URL. Używamy przy tym wyrażenia regularnego (.*), które dopasowuje dowolny adres URL, i wstawiamy go za domeną za pomocą $1:

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [L,R=301]

Jakie problemy i zagrożenia wiążą się z używaniem przekierowań 301?

Przekierowania 301 należą do standardowych narzędzi web developmentu i SEO. Jednak przy ich konfigurowaniu należy zachować ostrożność; gdy przekierowania są używane nieprawidłowo, mogą pojawić się poważne problemy. Serwer może ulec awarii lub witryna może stracić pozycję w wyszukiwarkach.

Uszkodzenie pliku htaccess przy ręcznej edycji

Plik htaccess konfiguruje serwer Apache na poziomie katalogu. Nawet najmniejsze błędne zmiany w pliku htaccess łatwo prowadzą do niedostępności witryny. Grozi wówczas słynny błąd serwera 500 lub „biały ekran śmierci” w WordPressie.

Przed edycją pliku htaccess najlepiej wykonać jego kopię zapasową. Z linii poleceń jest to bardzo proste. Przechodzimy do publicznego katalogu serwisu i używamy polecenia cp:

cp -a .htaccess _htaccess

Jeśli po zmianie pliku htaccess pojawią się błędy, przywracamy oryginalną wersję:

cp -a _htaccess .htaccess

Łańcuchowe przekierowania i pętle przekierowań

Przekierowania są przydatne, ale „kosztują” pełny cykl żądanie-odpowiedź. Gdy stosuje się łańcuchowe przekierowania, użytkownicy muszą czekać, co prowadzi do wyższego współczynnika odrzuceń. Również wyszukiwarki oceniają negatywnie strony, które przekierowują wielokrotnie z rzędu. Jako ogólna zasada przyjmuje się, że można łańcuchowo stosować maksymalnie trzy przekierowania.

Fatalne są pętle przekierowań, w których dwa adresy przekierowują na siebie nawzajem w nieskończoność. Dla użytkowników objawia się to błędem przeglądarki ERR_TOO_MANY_REDIRECTS. Żądany zasób jest wówczas niedostępny. Ogólnie nowo skonfigurowane przekierowania należy testować przy użyciu narzędzia cURL, aby upewnić się, że dają oczekiwane rezultaty.

Przypadkowe zatruwanie pamięci podręcznej przy użyciu przekierowania 301

Nieprawidłowe użycie przekierowania 301 może w późniejszym czasie przysporzyć problemów. W odróżnieniu od tymczasowych przekierowań typu 302, 303 i 307, przekierowanie 301 nakazuje klientowi zapisać nowy adres URL w pamięci podręcznej. Jeśli później chcemy wrócić do oryginalnego adresu URL, żądanie to nie dotrze do klientów; będą oni uparcie łączyć się z nowym adresem URL. Aby temu zaradzić, używa się tymczasowych przekierowań lub ustawia nagłówek Cache-Control na odpowiednią wartość.

Ustawiamy nagłówek Cache-Control na jedną godzinę podczas definiowania reguły Redirect 301 w pliku htaccess. Dzięki temu mamy pewność, że późniejsze zmiany celu przekierowania dotrą do wszystkich klientów:

ExpiresActive on
ExpiresDefault "access plus 1 hour"
Redirect 301 / https://www.example.com/

Gdy stosuje się złożone przekierowania z dyrektywami Rewrite, używamy sztuczki, aby ustawić nagłówek Cache-Control. Definiujemy zmienną środowiskową limitcache jako część reguły przekierowania 301. Następnie ustawiamy nagłówek, odczytując zmienną środowiskową jako warunek. Dzięki temu mamy pewność, że przy przekierowaniu zostanie ustawiony właściwy nagłówek:

RewriteRule ^.* http://www.example.com/ [L,R=301,E=limitcache:1]
Header always set Cache-Control "max-age=3600" env=limitcache

Podążyłeś za przekierowaniem 301 i teraz przeglądarka odmawia dostępu do oryginalnego adresu? Po prostu dołącz do starego adresu ciąg zapytania o dowolnej treści w postaci ?foo=bar i wymuś w ten sposób załadowanie adresu URL przez przeglądarkę.

$ post meta
categories: ["Poradniki"]
$ whoami
Piotr Cichosz
Piotr Cichosz
Od ponad 10 lat jestem zaangażowany w świat elektroniki użytkowej, zdobywając szeroką wiedzę i doświadczenie w testowaniu oraz recenzowaniu najnowszych technologii. Moja kariera obejmuje pracę w wiodących firmach technologicznych, gdzie specjalizowałem się w rozwiązywaniu złożonych problemów technicznych oraz doradzaniu w kwestiach wyboru sprzętu. Na moim blogu publikuję dokładne poradniki oraz recenzje urządzeń takich jak smartfony, routery i słuchawki, oferując czytelnikom rzetelne informacje oparte na wieloletnim doświadczeniu i skrupulatnych testach. Moim celem jest dostarczanie treści, które pomagają w podejmowaniu świadomych decyzji zakupowych oraz pełnym wykorzystaniu możliwości nowoczesnej elektroniki.
$ git log --neighbors
[PREV] GitHub zmienia model rozliczeń za Copilota 29 kwietnia 2026