Przekierowania to, najprościej ujmując, kody odpowiedzi HTTP, zaczynające się od cyfry 3. Można dzięki nimi wskazać zmieniony adres podstrony, skierować użytkownika do nowej domeny lub tymczasowo wyświetlać inną zawartość, gdy w sklepie internetowym zabraknie asortymentu.
Gdy wchodzimy na stronę internetową, przeglądarka wysyła prośbę do serwera o dane, niezbędne do jej wyświetlenia używając do tego HTTP (Hypertext Transfer Protocol).
W nagłówku odpowiedzi HTTP, którą odsyła serwer, zawarty jest trzycyfrowy kod informujący o statusie operacji. Jego znaczenie opisują standardy opracowane przez takie organizacje jak W3C. Przykładowo kod 200 powinien pojawić się, jeśli operacja została wykonana pomyślnie, a 404, gdy dany zasób nie istnieje.
Kody zaczynające się od cyfry 3 oznaczają przekierowania. Mogą:
W tym artykule zajmiemy się prawdopodobnie najpopularniejszym rodzajem przekierowań, czyli 301. Jest to przekierowanie permanentne – oznacza, że strona już na stałe znajdzie się pod nowym adresem. Drugim popularnym kodem jest 302, czyli przekierowanie tymczasowe.
Domyślnie przeglądarki internetowe działają zgodnie ze wskazanym kodem i przenoszą użytkownika na nowy adres oraz, jeśli jest to przekierowanie 301, zapisują go na stałe (ponowne wejście pod nowy adres będzie zawsze skutkowało przeniesieniem). Oczywiście zachowanie to może się różnić w zależności od ustawień, wtyczek lub włączonego trybu incognito.
Jeśli nasza strona jest hostowana na serwerze Apache (jest to aktualnie najpopularniejsze rozwiązanie do hostowania witryn) możemy wykonać takie przekierowanie w pliku .htaccess. Należy jednak pamiętać, że jego nieprawidłowa konfiguracja może spowodować, że strona przestanie działać. Przykładowo jeśli chcemy przekierować http://example.com/podstrona1 na http://example.com/podstrona2 będzie to wyglądać tak:
RewriteRule ^podstrona1$ http://example.com/podstrona2 [R=301]
Powyższy kod może wydawać się co najmniej zagmatwany, ale nie jest to nic skomplikowanego:
RewriteRule – reguła oznaczająca, że adres zostanie przepisany na inny po stronie serwera. Jeśli nie zastosowalibyśmy przekierowania, nie zmieniłby się on po stronie użytkownika.
^podstrona1$ – element, z którego chcemy przekierowywać. Opcjonalny znak ^ oznacza początek adresu, a $ koniec. Można tu korzystać z wyrażeń regularnych. Przekierowanie będzie działać dla wszystkich elementów, które pasują do wzoru.
http://example.com/podstrona2 – element, na który chcemy przekierować.
[R=301] – flaga oznaczająca, że ma zostać wykonane przekierowanie zawierająca również opcjonalny kod. Jeśli nie jest on podany (występuje samo [R]), domyślnie wykonywane jest przekierowanie 302. Flagi to krótkie instrukcje dodawane na końcu polecenia, wpływające na jego interpretację. Dobrą praktyką jest ustawianie “301” dopiero po wykonaniu testów – w innym wypadku przeglądarka może zapamiętać nieprawidłowe adresy.
Przy stosowaniu pliku .htaccess należy pamiętać o kilku rzeczach. Po pierwsze, aby w ogóle działały w nim przekierowania, należy uruchomić mod_rewrite. Jest to moduł odpowiadający za przepisywanie adresów. Przed wszelkimi przekierowaniami należy wstawić instrukcję:
RewriteEngine On
Sam moduł musi być jednak włączony w konfiguracji serwera.
Ważnym aspektem dotyczącym .htaccess jest to, że jest on wykonywany w kontekście danego folderu. Oznacza to, że jeśli w pliku znajdującym się w example.com/fajny-folder/ chcemy przekierować http://example.com/fajny-folder/cokolwiek.html to jako adres źródłowy musimy podać cokolwiek.html (opcjonalnie z ^ i $). Z kolei /cokolwiek.html zostanie zinterpretowane jako zupełnie inny element. W początkowym przykładzie założyliśmy, że plik znajduje się w głównym katalogu domeny (tak jest najczęściej).
Symbole, których użyliśmy w adresie źródłowym pomagają uniknąć błędów, takich jak pętla przekierowań. Jest to sytuacja, kiedy jedno przekierowanie prowadzi jedynie do kolejnych i ostatecznie nie powoduje wyświetlenia prawidłowej podstrony. Np. example.com/podstrona1 kieruje na example.com/podstrona2, które z kolei kieruje na example.com/podstrona3, a ta znowu na example.com/podstrona1…
Dzięki zastosowaniu ^ wskazujemy, że chodzi nam tylko o adresy, które zaczynają się od danego ciągu znaków. Gdybyśmy w powyższym przykładzie nie zastosowali tego symbolu, byłoby ono wykonywane także dla adresów example.com/cokolwiek/podstrona1 czy example.com/nie/wiem/po/co/tyle/folderow/podstrona1. Brak $ spowodowałby, że wykonałoby się ono np. także dla example.com/podstrona1cokolwieksetudopiszesz.
Przy użyciu języka skryptowego PHP możemy ręcznie ustawić wybrany nagłówek oraz nadać mu odpowiedni kod. Poniżej przykład przekierowania na example.com/polecam301:
<?php
header(‘Location: http://example.com/polecam301’, 301);
die();
?>
Funkcja header przyjmuje jako pierwszy parametr treść nagłówka, a jako drugi kod odpowiedzi. Jeśli nie zostanie on podany, dla przekierowań wyniesie 302. Funkcja posiada również opcjonalny parametr (domyślnie ustawiony na TRUE), mówiący, czy nagłówek powinien zastąpić dotychczasowy.
Ważne jest, aby przekierowanie znalazło się ponad jakimkolwiek innym kodem, aby mieć pewność, że zostanie poprawnie wykonane. Funkcja die() (można też użyć exit() ) występuje tu ze względów bezpieczeństwa – ostatecznie przeglądarka lub np. robot indeksujący stronę nie musi respektować nagłówka, a w takim przypadku wykonany zostałby pozostały kod pliku, co mogłoby być działaniem niepożądanym.
Istnieją mechanizmy, pozwalające na stworzenie przekierowania już po załadowaniu strony. Można tego dokonać za pomocą tagu HTML meta z atrybutem http-equiv.
meta http-equiv=”Refresh” content=”0; url=”http://example.com/
Powyższy kod powoduje przekierowanie na http://example.com. Liczba w atrybucie content oznacza liczbę sekund, po których ma ono zostać wykonane, a url to docelowy adres. Teoretycznie przy opóźnieniu 0 sekund Google traktuje to jak poprawne przekierowanie 301. Innym sposobem jest wdrożenie go przy użyciu JavaScript, jednak może to być źle interpretowane przez wyszukiwarkę.
Kod 301 spotykany jest w wielu sytuacjach. Poniżej wyróżniamy kilka podstawowych zastosowań wraz z ich przykładami w pliku .htaccess (w miejsce przykładowych nazw wystarczy wstawić własne):
Kiedy zmieniamy domenę, pod którą ma się pokazywać nasza strona, najlepiej przekierować na nią starą wersję. Pomoże to zachować ruch od dotychczasowych użytkowników, którzy w innym przypadku mogliby np. pomyśleć, że witryna przestała już istnieć. Z punktu widzenia SEO przekazana zostaje „moc” domeny, dzięki czemu unikniemy nagłego spadku pozycji. Przykład przekierowania example.com na najlepszastronanaswiecie.pl:
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule (.*)$ http://najlepszastronanaswiecie.pl/$2 [R=301,L]
Gdzie:
RewriteCond – warunek, który musi zostać spełniony, aby wykonała się instrukcja przepisania adresu.
%{HTTP_HOST} – zmienna zawierająca nazwę hosta; porównywana jest ona tutaj z ^example.com$ – jeśli się zgadza, to warunek jest spełniony.
(.*) – wyrażenie regularne oznaczające dowolny ciąg znaków. Elementy w nawiasach są traktowane jako kolejne zmienne (oznaczone $2, $2 itd.), tutaj wykorzystane, aby każda podstrona była odpowiednio przekierowana. Przykładowo po wejściu na example.com/costam, $2 będzie równe “costam” i ostatecznie adres przyjmie formę http://najlepszastronanaswiecie.pl/costam.
Zastosowaliśmy również flagę L, która powoduje, że po wykonaniu danej instrukcji adres nie będzie już dalej przepisywany.
Jeśli posiadamy certyfikat SSL to, aby upewnić się, że połączenie z naszą witryną używa bezpiecznego protokołu HTTPS, powinniśmy wprowadzić odpowiednie przekierowanie z niezabezpieczonych adresów. Poniżej przykład:
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}/$2 [R=301,L]
Warunek RewriteCond sprawdza czy zmienna %{HTTPS} jest równa „on”. Ma to miejsce, gdy adres zawiera https. Jeśli tak nie jest, przekierowywany jest on na odpowiednią wersję.
Dla Google adresy example.com oraz www.example.com są zupełnie osobnymi domenami. Choć to rzadko spotykane, subdomena www może mieć inną zawartość. Z tego powodu najlepiej, aby strona była pokazywana tylko pod jedną wersją, a druga po prostu na nią przekierowywała. Poniżej kod rozwiązujący ten problem:
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule (.*)$ http://example.com/$2 [R=301,L]
W przypadku domeny wildcard oznacza wszystkie jej subdomeny. Źle skonfigurowana strona może powodować wyświetlanie się tej samej zawartości po podaniu dowolnego ciągu znaków przed adresem np. dfskdfsdf.example.com. Aby tego uniknąć, można zastosować poniższe przekierowanie:
RewriteCond %{HTTP_HOST} ^(.+).example.com$
RewriteRule (.*)$ http://example.com/$2 [R=301,L]
Powyższy kod przekierowuje każdą subdomenę na domenę główną – example.com. Jest to też bardziej rozbudowane rozwiązanie poprzedniego problemu, gdyż przekieruje on również www.example.com.
Poza opisanymi już przykładami, plik .htaccess oferuje ogrom możliwości. Można w nim tworzyć bardzo skomplikowane instrukcje dotyczące nie tylko przekierowań. Za jego pomocą możemy też włączyć między innymi kompresję zasobów. Poniżej opisujemy kilka przydatnych elementów, które są często wykorzystywane.
Kod znajdujący się w komentarzach jest ignorowany. Mogą one służyć wyjaśnieniu poszczególnych instrukcji w kodzie lub np. do wyłączenia niektórych elementów w ramach testów. Komentarze rozpoczynają się znakiem #. Przykład:
#to jest komentarz
RewriteRule ^cokolwiek$ http://example.com/nic [R=301]
#RewriteRule ^nic$ http://example.com/cos [R=301]
#powyższa instrukcja nie zadziała bo jest zakomentowana
Dotychczas opisaliśmy flagi R oraz L. Często wykorzystywana jest również NC (no case) powodująca, że ignorowana jest wielkość liter. Flaga QSA (query string append) z kolei sprawia, że zmienne z adresu źródłowego zostaną dodane do nowego, zamiast być zastąpione. Poniżej przykład:
RewriteRule ^test1$ http://example.com/lepszy-adres [R=301]
RewriteRule ^test2$ http://example.com/lepszy-adres?x=1 [R=301]
RewriteRule ^test3$ http://example.com/lepszy-adres?x=1 [R=301, QSA]
Wyniki są następujące:
RewriteCond %{HTTP_HOST} example.com [OR]
RewriteCond %{HTTP_HOST} jakasinnadomena.pl
RewriteRule ^test$ http://%{HTTP_HOST}/testowy [R=301]
Tutaj przekierowanie będzie wykonane zarówno dla domeny example.com jak i jakasinnadomena.pl.
Przekierowania 301 są niezwykle pomocne. Zastosowanie wyrażeń regularnych oraz odpowiednich instrukcji w pliku .htaccess daje ogromny wachlarz możliwości. Dzięki ich znajomości, da się rozwiązać wiele mniej lub bardziej powszechnych problemów związanych z zarządzaniem serwisem internetowym. Więcej informacji znajdziesz w oficjalnej dokumentacji Apache.