Poradnik tłumaczący od podstaw do kwestii zaawansowanych działanie dowolnego przekierowania, w tym między innymi HTTP, PHP, Apache, HTML oraz JavaScript, a nawet WordPress. W internecie można znaleźć wiele różnych definicji przekierowań, często również przeczą sobie nawzajem, dlatego też powstał ten artykuł, mający na celu rozwiać wszelkie wątpliwości.
Wszystkie przekierowania opiszę w skrócie, czym się charakteryzują i kiedy ich używać (albo i nie). Podam przykłady kodu, jakim dany rodzaj redirect’a zainicjujemy. Nie zabraknie również aspektu SEO, który pojawia się zawsze, gdy pojawiają się redirecty.
Artykuł stworzyłem bazując na własnym doświadczeniu (administrator sporych serwisów internetowych, samozwańczy Back-endowiec i Front-endowiec) oraz dokumentacji Google + Mozilla (w przypadku HTTP). Jeżeli jednak dostrzegasz gdzieś błąd, proszę powiadom mnie tutaj, ponieważ zależy mi na rzetelności każdej treści. Dziękuję i zapraszam do lektury 😉
Spis Przekierowań:
- Przegląd kodów HTTP
- Czym są przekierowania
- Plik .htaccess
- Przekierowania HTTP:
300 | 301 | 302 | 303 | 304 | 305 | 307 | 308 - Przekierowanie PHP
- Przekierowania w SEO
- Alternatywne rodzaje przekierowań
- Podsumowanie
Przegląd przekierowań HTTP
Kod HTTP | Nazwa | Typ | Opis |
---|---|---|---|
300 | Miltiple Choices | Stałe | Umożliwia dokonanie wyboru pomiędzy kilkoma stronami docelowymi. |
301 | Moved Permanently | Stałe | Strona zmieniła lokalizację na stałe. Przenosi SEO strony na inną lokalizację. |
302 | Found | Tymczasowe | Strona tymczasowo zmieniła lokalizacje. Nie przenosi mocy SEO. |
303 | See Other | Tymczasowe | Tymczasowe przekierowanie stosowane w formularzach wysyłanych metodą POST lub PUT. Nie ukazuje wskazanego zasobu, a inny. |
304 | Not Modified | Inne | Dane w pamięci podręcznej przeglądarki są aktualne, nie ma potrzeby ich aktualizacji. |
305 | Use Proxy | Inne | Wymusza użycie proxy. |
— | — | Nieużywany, zarezerwowany na porzeby zgodności starszych wersji protokołu HTTP | |
307 | Temporary Redirect | Tymczasowe | Strona została tymczasowo przeniesiona. Porównanie 302 vs 307. |
308 | Permament Redirect | Stałe | Strona została przeniesiona na stałe. W przeciwieństwie do 301 wymusza użycie żądania GET. Porównanie 308 z 301. |
Pobierz skrót w formie infografiki na potem poniżej:
Czym są redirecty?
Przekierowania (ang. redirects) – to mechanizmy, które umożliwiają przeniesienie odwiedzającego na inną stronę niż początkowo otworzył. Najbardziej popularne polegają na wysłaniu przez serwer do wyszukiwarki odwiedzającego specjalnego kodu HTTP wraz z adresem docelowym. Następnie przeglądarka realizuje kod według ustandaryzowanych w protokole HTTP działań. Wszystkie przeglądarki powinny identycznie interpretować te kody. Każdy kod reprezentuje inny rodzaj przekierowania, same kody rozpoczynają się od 30X, gdzie X reprezentuje rodzaj redirect’a.
Najpopularniejsze rodzaje redirectów to: 301, 302 oraz 307.
Do czego służą przekierowania?
Służą do niwelowania niepoprawnych, nieaktualnych linków, do zmiany działania przeglądarki by reagowała zgodnie z działaniami na stronie, czy też do poinformowania robotów indeksujących o zmianach w strukturze strony. Mają ogromny wpływ na SEO, dlatego należy ich używać zgodnie z przeznaczeniem. Dalsza część pokaże Ci jak to poprawnie robić.
Przekierowania wewnętrzne i zewnętrzne
Wewnętrzne to redirecty w obrębie jednej witryny, zewnętrzne jak sama nazwa sugeruje, prowadzą do innej domeny – lub subdomeny (ponieważ one są interpretowane przez wyszukiwarki jak oddzielne witryny).
Jak stosowane są redirecty?
To zależy od metody przekierowania, jaką wybierzemy niektóre maja swoje wady i zalety, niektóre są szybsze, a niektóre celowo wprowadzają czas opóźnienia. Postawowe redirecty są ustalane w spechalnym pliku .htaccess na serwerze strony. Inne mogą być stosowane w plikach PHP strony, a jeszcze inne (Meta lub JS) w samej jej kodzie.
.htaccess
Plik konfiguracyjny serwera bazującego na oprogramowaniu Apache. Znajduje się w głównym katalogu strony. Zmienia sposób działania serwera w określonych przypadkach bez konieczności aktualizacji plików samego serwera. Umożliwia ustawienie prostych przekierowań http, jak również tych bazujących na wyrażeniach regularnych. Dodatkowo można z jego poziomu zabezpieczyć hasłem określony katalogi, wprowadzić reakcje na błędy, czy też zmienić sposób, w jaki serwer obsługuje niektóre typy plików.
[!] Obecnie większość komercyjnych hostingów bazuje na oprogramowaniu Apache.
Podstawowe przekierowanie http
Składnia przykładowego redirect’a http 302 wykonany z poziomu pliku .htaccess:
Redirect 302 <ścieżka> <ścieżka>
lub w przypadku przekierowania do katalogów:
RedirectMatch 301 /<stary katalog>/ /<nowy katalog>/
Kod należy umieścić w pliku .htaccess, może on zawierać wiele typów operacji jednocześnie. Pamiętajmy jednak by nie doprowadzić do przeczenia sobie nawzajem tych poleceń.
Wyrażenia regularne
Wyrażenia regularne to opisy zależności lików, które serwer ma wykrywać i kierować gdzie indziej. Są używane np. gdy chcemy przekierować w całą witrynę na nową domenę z zachowaniem struktury linków, lub gdy zamieniamy http na https.
Przekierowanie do zewnętrznej witryny z użyciem wyrażenia regularnego
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?STARY-ADRES\.pl [NC]
RewriteRule (.*) http://NOWY-ADRES.pl/$1 [R=301,L]
Wyrażenie regularne przepisujące HTTP na HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
[!] Przekierowania na https powinny zawierać [L,R=301]
, które informuje roboty indeksujące o tym, że mają przenieść moc stron http na https – zgodnie z działaniem HTTP 301. Wiele poradników o tym nie wspomina. W innym wypadku roboty muszą same się domyślić.
Przekierowania kodów błędu
Z poziomu .htaccess można również wprowadzić reakcję serwera na wszelkie błędy. W tym przypadku zwrot w postaci błędu 404 (strony nie znaleziono), przekieruje użytkowników na wybraną stronę.
ErrorDocument 404 https://przyklad.com/
Jest to przydatne, gdy strony błędów są umiejscowione pod inną lokalizacją, lub po prostu chcemy zwrócić wtedy stronę główną.
Generator przekierowań i plików .htaccess
W celu łatwego tworzenia plików tego typu powstało bardzo dużo generatorów. Znajdziesz je pod frazą „.htaccess generator”. Ułatwiają one w znaczącym stopniu generowanie plików z redirectami. W podobny sposób możesz również znaleźć testery tych plików.
PHP – Najszybsze przekierowanie
Do najszybszego przekierowania odwołującego się do innej strony zaliczamy te wykonane za pomocą PHP, a nie te za pomocą metod HTTP w pliku .htaccess. Wersja PHP używana przez serwer również ma tutaj znaczenie — czym jest nowsza, tym przekierowanie może okazać się szybsze. Według przeprowadzanych testów wersja 7+ poczyniła duży skok wydajnościowy. Powinno być używane przed jakimkolwiek kodem – również przed deklaracją <!DOCTYPE>
.
Składnia przekierowania w pliku PHP wygląda następująco:
<?php header("Location: http://www.strona.pl/katalog-docelowy"); ?>
Przekierowanie może być zamieszczone w dowolnym pliku, np. index.php dla strony głównej. Przekierowanie tego typu może prowadzić zarówno do katalogu, jak i do konkretnego pliku, jego rozszerzenie nie jest niczym ograniczone.
Tak stworzone przekierowanie jest szybkie, ma jednak wielką wadę – domyślnie zwraca tylko kod HTTP 302. Dodatkowo przeglądarki używają polecenia GET, zamiast wykonać prawdziwe przekierowanie. Aby przekierowanie mogło działać zgodnie z zamiarem, konieczne jest jeszcze dodanie nagłówka określającego typ przekierowania:
header('HTTP/1.1 301 Moved Permanently');
W ten sposób roboty indeksujące będą wiedzieć, jakie zamiary ma to przekierowanie (np. czy strona jest przeniesiona na stałe, czy jedynie tymczasowo). Nagłówek umieszczamy przed linijką z przekierowaniem.
Bezpieczeństwo
Popraw bezpieczeństwo reszty zawartości pliku PHP dodając funkcję die();
lub exit();
zaraz po przekierowaniu. Sprawi to, że reszta zawartości pliku będzie utajniona dla botów sprawdzających, ponieważ PHP zakończy swoje działanie zaraz po wykonaniu przekierowania. W innym przypadku tak się nie stanie (jeśli reszta pliku nie jest pusta).
Przekierowanie w PHP, tylko w ten sposób
Aby przekierowanie PHP zostało dobrze wykonane i bezpieczne dla SEO, zawsze używaj go w kombinacji z dodatkowym nagłówkiem oraz końcową funkcją. Prawidłowo wykonane wygląda następująco:
header('HTTP/1.1 301 Moved Permanently');
<?php header("Location: http://www.strona.pl/nowa-strona"); ?>
exit();
header
poinformuje roboty indeksujące oraz przeglądarki o zaistniałej sytuacji poprzez nagłówek z odpowiednim kodem HTTP redirecta – w tym przypadku 301. Końcowa funkcja exit();
podwyższy bezpieczeństwo reszty zawartości pliku przed nieautoryzowanym odczytem, który mógłby mieć wpływ na SEO oraz bezpieczeństwo strony.
Alternatywne rodzaje przekierowań
Rodzaje przekierowań, które powinny być używane jedynie wtedy, gdy implementacja przekierowań po stronie serwera strony jest niemożliwe, lub technologia aplikacji Webowej je uniemożliwia.
Przekierowanie HTML – Meta refresh
Przekierowanie z poziomu pliku HTML – powinno zostać umieszczone pomiędzy znacznikami <head></head>
, najlepiej na początku:
<meta http-equiv="refresh" content="0; url=https://strona.pl/katalog">
Jest to jedyny rodzaj redirecta zalecany, gdy nie można odsyłać po stronie serwera.
Opóźnione przekierowania
Funkcjonalność meta refresh umożliwia również ustawienie redirecta o opóźnionym działaniu. Przydaje się, gdy chcesz powiadomić użytkownika o fakcie, że zaraz zostanie on przekierowany, np. „Zostaniesz przekierowany za 3 2 1”
Przykład opóźnionego przekierowania:
<meta http-equiv="refresh" content="5; url=https://strona.pl/katalog">
Ustawienie parametru content="5;
umożliwi opóźnienie przekierowania o 5 sekund.
Przekierowanie JavaScript
JavaScript nie powinien być używany do przekierowywania, ponieważ roboty indeksujące Google mogą go nie wykryć, więc ma on realny wpływ na SEO strony. Powinno się go używać, tylko jeśli nie można użyć redirecta typu Meta.
Taki redirect zostanie wykryty najprawdopodobniej tylko wtedy, jeśli to jedyna treść znacznika <script>
na stronie, w innym przypadku roboty indeksujące mogą go po prostu ominąć, ponieważ nie studiują działania skryptów na stronie, tym bardziej, jeśli przekierowanie odbywałoby się po spełnieniu odpowiedniego warunku.
Przekierowanie wykonane w JavaScript:
window.location.href = "https://strona.pl/katalog";
Można je zaimplementować w pomiędzy znacznikami <script></script>
w kodzie strony. Dobrą praktyką jest umieszczanie skryptów JavaScript za kodem samej strony, tuż przed znacznikiem </body>
. Jednak w tym przypadku należy zrobić wyjątek z uwagi na szybkość wykonania przekierowania, dlatego kod skryptu powinien być zaimplementowany w sekcji <head>
strony – na samym początku.
Przekierowania Crypto
Są niczym innym niż linki. Reprezentuje je znacznik HTML <a href>
. W gruncie rzeczy są one redirectami tylko z nazwy, ale lepiej jest zamieścić link do aktualnej lokalizacji strony, niż nie zamieszczać go wcale. Roboty indeksujące przechodzą na strony, do których prowadzą linki w indeksowanej treści, więc jest wielce prawdopodobne, że odkryją również nową lokalizację strony.
Warto jednak wspomnieć, że nie w każdym przypadku tak się dzieje, dlatego samo Google w dokumentacji SEO nie zaleca używania linków do informowania wyszukiwarek o przeniesieniu lokalizacji strony. Pokuszę się jednak o stwierdzenie, że jest to skuteczniejszy sposób niż JavaScript.
Przykład:
<a href="https://przykładowa.strona.pl/nowa-lokalizacja">STRONA ZMIENIŁA LOKALIZACJĘ</a>
Rodzaje wszystkich przekierowań HTTP
Poniżej znajdują się szczegółowe opisy wszystkich kodów HTTP dotyczących redirectów.
300 (Multiple Choices – wilokrotnego wyboru)
Przekierowanie, które oferuje wybór pasujących zasobów (każdy może reprezentować inny cel żądania). Odwiedzający może więc wybrać, do której strony docelowej chce być przekierowany.
Przekierowanie 301 (Moved Permanently — przeniesione na stałe)
Adres został przeniesiony na nowy adres. Daje informację przeglądarce, że powinna zachować nowy adres w swojej pamięci podręcznej i automatycznie przekierowywać użytkownika następnym razem. Może posłużyć jako przekierowanie zewnętrzne (przy zmianie domeny).
Redirect 301 /plik.html https://nowa-strona.com/plik.html
302 (Found – tymczasowo znaleziony)
Informuje, że dany adres został tymczasowo przeniesiony na inny adres. Informuje przeglądarkę, że nie powinna zapisywać tego adresu w pamięci podręcznej z uwagi na jego tymczasowy charakter. Daje znać robotom indeksującym, aby nie przenosić mocy SEO. Jego następcą jest redirect 307.
Redirect 302 /plik.html /katalog/plik.html
303 (See Other – Zobacz resztę)
Powinno być stosowane w formularzach, które są przekazywane metodą HTTP POST lub PUT. Po przesłaniu formularza przeglądarka otrzyma odpowiedź zwrotną serwera w postaci przekierowania 303 na następną stronę, np. stronę potwierdzenia rejestracji. Jest to jednocześnie potwierdzenie dla przeglądarki, że przesył danych zakończył się pomyślnie i może ona bezpiecznie kontynuować. Następstwem jest wysłanie przez przeglądarkę żądania GET w celu uzyskania strony wskazanej w przekierowaniu.
Przykład:
Redirect 303 /plik.php https://stara-strona.com/plik2.php
304 (Not Modified)
Przekierowanie do wcześniej zbuforowanego wyniku. Redirect 304 informuje, że dane w pamięci podręcznej przeglądarki są aktualne, nie ma potrzeby ich aktualizacji. W gruncie rzeczy nic się nie zmienia, przeglądarka pozostaje na tej samej stronie – wczytuje ją z pamięci podręcznej.
305 (Use proxy – korzystaj z proxy)
Obecnie nieużywane ze względu na bezpieczeństwo. Pozwala na przekazanie odwiedzającemu informacji o konieczności skorzystania z serwera proxy, zanim będzie mógł odczytać informacje.
307 (Temporary Redirect – tymczasowe przekierowanie)
[!] Redirect 307 powstał w HTTP 1.1 jako następca redirect’a 302 z HTTP 1.0, które przeglądarki interpretowały niepoprawnie – zawsze zamieniały żądanie na GET, choć nie powinny – ponieważ w zamyśle miało ono pozostać takie samo. To wymusiło powstanie 307.
Informuje, że docelowy adres został tymczasowo przeniesiony na inny adres. Jednak w przyszłych zapytaniach, przeglądarka dalej powinna otwierać docelowy adres (nie adres z przekierowania). Przekierowanie 307 różni się od przekierowania 303 tym, że następne żądanie przeglądarki dalej będzie obywało się pierwotną metodą POST, a nie – tak jak w przypadku 303 – korzystając z GET. Dodatkowo jest używane do stron, a nie formularzy.
Prostym przykładem zastosowania w przypadku 307 będzie:
Jeżeli przeglądarka w ramach formularza rejestracja.php wysłała żądanie POST (aby przesłać dane), to w przypadku następnej strony, na którą trafiła – logowanie.php, przeglądarka ponownie użyje żądania POST, a nie żadnego innego (bo musi ponownie przesłać dane).
Przy użyciu 307 nie podajemy nazwy domeny, ani przedrostka http:// lub https:// w pierwszym podawanym adresie:
Redirect 307 /adres/ https://przykladowa-domena.pl/
308 (Permanent Redirect – Stałe przekierowanie)
Informuje, że zasób docelowy ma nowy stały adres URL. Identyczne co przekierowanie 301, lecz różni się tym, że w przeciwieństwie do przekierowania 301 nie pozwala na zmianę metody żądania HTTP np. z POST na GET.
Redirect 308 /plik.php https://nowa-strona.com/plik2.php
Przekierowania ważne dla SEO
Najważniejszymi z punktu optymalizacji SEO, będą przekierowania typu: 301/308 oraz rzadziej 302/307. Dlatego opiszę tutaj szybko różnice pod względem SEO. Dodatkowo opowiem, jak można przekierowywać w WordPressie.
301 vs 308
Z punktu widzenia technicznego, przekierowanie 308 jest bardziej klarowne, gdyż z góry określa, że przeglądarka musi użyć żądania GET. 301 w przeciwieństwie do 308 nie ma sprecyzowanego żądania. Z drugiej jednak strony większość przekierowań jest realizowana za pomocą żądania GET – 301 również. Poza tym aspektem przekierowania nie mają żadnej różnicy – oba przenoszą moc poprzednich linków do nowej lokalizacji.
SEO: Oba przenoszą moc strony do nowej lokalizacji. Przekierowania różnią się jedynie pod względem technicznym – choć w większości przypadków będą i tutaj działać tak samo.
Zdaniem przedstawicieli Google: „jeśli używasz 308 jak 301, będziemy tak samo je traktować”.
302 vs 307
307 to następca 302, ponieważ definiuje metodę żądania i jest teoretyczynie bezpieczniejsze dla użytkownika (choć nie zawsze, w niektórych przypadkach może posłużyć do przechwycenia danych przez cyberprzestępcę za pomocą ponownego żądania POST).
SEO: Jeśli patrzymy na fakt, że 307 jest następcą starszego i błędnie interpretowanego 302, to powinno się używać 307 zamiast 302. Jednak obie opcje są neutralne dla SEO i nie przenoszą mocy linka dalej, dają natomiast znać wyszukiwarce, że adres został jedynie tymczasowo przeniesiony.
Przenoszenie treści wewnątrz domeny
Do tego działania wystarczy zwykły redirect 301. Ważnym jest jednak, aby treści w domenie nie dublowały się, choć i temu można zaradzić implementując tag rel="cannonical"
w kodzie strony, która zawiera powieloną treść.
Przenoszenie strony na inną domenę poprawne z SEO
Jeśli przekierowujemy stronę na nową domenę, powinniśmy to jasno zakomunikować robotowi indeksującemu, aby nasza strona nie straciła na ocenie SEO, a nawet żeby przeniesione treści nie zostały potraktowane jako plagiat, który może całkowicie stronę wyeliminować z wyników wyszukiwania. Odpowiedzialność jest zatem bardzo duża, ale posiadamy narzędzia, które umożliwiają nam takie operacje względnie bezpiecznie wykonać. Ostatecznie jednak decyzje o pozycjonowaniu podejmują roboty indeksujące, więc lepiej, żeby nie musiały się w tej kwestii domyślać „co się wydarzyło?”, bo to może się różnie skończyć.
W celu zewnętrznego przekierowania na nową domenę użyjemy:
- Wyrażenia regularnego przenoszącego całą strukturę linków na nową domenę z redirectem 301
- W momencie stworzenia przekierowania wszystkich linków wyłączymy pierwszą domenę z użytku.
Najważniejszą kwestią jest stworzenie odpowiedniego wyrażenia regularnego – i sprawdzenie jego działania, zanim podejmiemy się jakiegokolwiek przenoszenia. Wyłączenie z użytku pierwszej domeny również jest bardzo ważne, ponieważ w innym przypadku roboty indeksujące dalej mogą weryfikować słuszność uznania drugiej domeny za główną.
Przykład wyrażenia przenoszącego całą strukturę linków na nową domenę:
RewriteEngine on
RewriteRule .? https://nowa-domena.pl%{REQUEST_URI} [L,R=301]
Oczywiście adresy stron muszą zostać odpowiednio uzupełnione.
Wyrażenie regularne powinno działać tak długo, aż każdy link w wyszukiwarce Google zamieni się na adres nowej domeny. W weryfikacji postępów pomoże narzędzie Google Search Console, gdzie trzeba będzie oprócz starej domeny podpiąć również i nową.
Przekierowania w CMS WordPress
System zarządzania treścią WordPress wygeneruje redirect’y w wielu przypadkach sam – gdy tylko zmienimy link wpisu. Tak utworzone przekierowania nazywane są Old Slugs. Warto jednak wziąć pod uwagę, że są one niewidoczne w WordPress’ie (z poziomu interface’u graficznego). W tej kwestii WordPress skutecznie tworzy przeniesienia 301 przyjazne dla robotów indeksujących bez konieczności ingerencji. Najłatwiejszym sposobem na weryfikację czy Old Slug działa, jest wpisanie poprzedniego linku wpisu w pasku przeglądarki.
Jeśli chcemy mieć jednak większą kontrolę nad przekierowaniami, możemy umieszczać je w pliku .htaccess z poziomu serwera (.htaccess ma pierwszeństwo nad Old Slug’ami WordPress’a). Dodatkowo możemy skorzystać z bezpłatnych wtyczek z intuicyjnymi interface’ami takich jak Redirection, dzięki czemu nie musimy za każdym razem modyfikować ręcznie plików na serwerze. W organizacji przekierowań może pomóc również dobrze znana wtyczka YoastSEO, ale posiada opcje ręcznej ingerencji w tą funkcjonalność dopiero w płatnej wersji.
Podsumowanie
Zbiór wszystkiego, co najważniejsze:
- Powtarzające się reguły linków – używamy wyrażeń regularnych.
- Najszybsze przekierowanie – korzystamy z PHP.
- Strona przeniesiona na nową lokalizację na stałe – używamy przekierowania 301 lub 308 (nie ma znaczenia).
- Przenosimy stronę tymczasowo – używamy 307 (nie przenosi mocy linka).
Źródła: Dokumentacja I Dokumentacja
Jeśli dostrzegasz gdzieś błąd lub nieaktualność danych, zgłoś to poprzez formularz kontaktowy.