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.
- Klient próbuje uzyskać dostęp do zasobu pod danym adresem URL.
- Serwer odpowiada kodem statusu 301 „Moved Permanently” i przekazuje w nagłówku HTTP Location nowy adres URL dostępu do zasobu.
- Klient zapisuje nowy adres URL w pamięci podręcznej; kolejne żądania do starego adresu URL są od razu kierowane pod nowy adres.
- 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ę.