Mod_rewrite to wyspecjalizowany dodatek do serwera WWW umożliwiający wykonanie “przezroczystego” dla użytkownika przekierowania na inny adres URL.
Posiada wiele zastosowań, począwszy od prostej zmiany nieaktualnych adresów na nowe, aż do zmiany linków zawierających zmienne wysyłane w standardzie GET na prostsze, dzięki czemu są one znacznie przyjaźniejsze zarówno osobom odwiedzającym serwis, jak również i wyszukiwarkom internetowym.
Spis treści
Wstęp do przekierowywania adresów
Czytelne adresy to podstawa. Dobrze zaprojektowana strona internetowa posiada także logicznie rozplanowaną strukturę adresów. Zawarte jest w nich często wiele informacji pozwalających odwiedzającemu na zapamiętanie z łatwością pełnego adresu strony.
Jednakże wiele systemów zarządzania zawartością używa linków wyglądających podobnie do poniższego:
http://www.mojafirma.pl/sklep.php?kategoria=kapelusze&produkt=123
Nie jest to przyjazny adres, jednakże programistom dzięki standardowym mechanizmom języków skryptowych (PHP, ASP) jest go najłatwiej zaimplementować.
Ponadto wiąże się z nim kilka problemów:
- Prezentuje wszystkim odwiedzającym budowę naszego serwisu. Widać w nim nazwę pliku ze skryptem odpowiedzialnym za stronę i nazwy wszystkich pobieranych zmiennych. Może to stanowić furtkę dla crackerów próbujących podmienić wartości zmiennych na inne.
- W przypadku stosowania przepisywania linków zarówno struktura plików jak i nazwy poszczególnych zmiennych są przed odwiedzającym ukryte.
W przypadku zmiany technologii wykonania strony zazwyczaj ulegają zmianie adresy URL. Powoduje to chaos wśród odwiedzających kierowanych z innych stron i wyszukiwarek internetowych. W przypadku stosowania mod_rewrite adresy będą wyglądać tak samo, niezależnie od użytego oprogramowania. - Linki do stron zawierają znaki specjalne, takie jak znak zapytania (?) oraz ampersand (&), przez co w przypadku tworzenia hiperłączy wymagany jest ich specjalny zapis w formie &
- Niektóre wyszukiwarki nie indeksują treści generowanych dynamicznie. Dzięki podmianie linków wyglądają one na statyczne strony HTML, które to są analizowane bez problemów.
Używając przepisywania linków uzyskamy więc znacznie prostszy i łatwiejszy do zapamiętania adres.
http://www.mojafirma.pl/produkty/kapelusze/123/
Jest on znacznie logiczniejszy, czytelniejszy i łatwiejszy do zapamiętania. Ponadto żadna wyszukiwarka nie będzie miała z nim problemów.
Proste przepisywanie linków
Proste przekierowania
Na początek zastosujemy bardzo proste przekierowanie. Załóżmy, że zmieniliśmy nazwę pliku z strona.html na nowa_strona.html. Odwiedzający poprzez link /strona.html domyślnie ujrzeli by błąd o kodzie 404 – nie znaleziono strony. Ustawiając odpowiednią regułę pozwolimy na korzystanie także ze starego adresu.
W tym celu tworzymy plik .htaccess z następującą treścią:
- RewriteEngine on
- RewriteRule ^strona\.html$ nowa_strona.html
Pierwsza linijka włącza moduł rewrite. W drugiej natomiast informujemy serwer, iż przy próbie dostępu do pliku strona.html powinna zostać wyświetlona zawartość pliku nowa_strona.html
Wyrażenie dotyczące starej strony to najtrudniejsza rzecz w zrozumieniu tej reguły.
Widzimy w nim trzy znaki specjalne:
- Znak ^ oznacza początek ścieżki do wirtualnego pliku znajdującego się wewnątrz katalogu w którym znajduje się plik .htaccess
- Znak dolara ($), oznacza koniec analizowanej ścieżki wirtualnego pliku.
- Ukośnik (\) znajdujący się przed kropką to specjalny znacznik wyrażenia regularnego, mówiący, iż następny znak nie jest znakiem specjalnym wyrażenia regularnego, a normalnym znakiem.
Po umieszczeniu tego kodu i otworzeniu pliku strona.html ukaże się nam zawartość nowa_strona.html. Odwiedzający nie zauważy żadnej różnicy.
Wymuszenie zmiany adresu
W opisanym wcześniej przypadku użytkownik odwiedzający stronę nie zauważy zmiany adresu. Możliwe jest zastosowanie tzw. przekierowania – wówczas do przeglądarki zostanie wysłany nakaz odświeżenia adresu w przeglądarce oraz odwiedzenia już nowej strony.
W tym celu na końcu reguły zaprezentowanej powyżej należy dopisać ciąg [R].
RewriteRule ^strona\.html$ nowa_strona.html [R]
Przekierowania zaawansowane używające wyrażeń regularnych
Teraz poznamy naprawdę użyteczne narzędzie. To w nim tkwi cała potęga mod_rewrite.
Jeśli to Twoja pierwsza przygoda z wyrażeniami regularnymi, ich zrozumienie może nastręczyć na początku wielu trudności. Ułatwią Ci to przedstawione przykłady.
Używając wyrażeń regularnych możemy automatycznie przepisać wiele adresów w tym samym momencie.
RewriteRule ^produkty/([0-9][0-9])/$ /informacje.php?ID=$1
Powyższa reguła przechwyci wszystkie adresy rozpoczynające się od ciągu “produkty/12/” następnie dwie cyfry i znak “/”. Przykładowo “produkty/12/” oraz “produkty/99/” przeniosą nas do naszego skryptu.
Części w nawiasach kwadratowych to tzw. zakresy. W naszym przypadku są to cyfry od 0 do 9. Inne ich przykłady to [A-Z] – wielkie litery, [a-z] – małe litery, [A-Za-z] – wszystkie litery bez względu na wielkość.
Umieściliśmy wyrażenie regularne w nawiasach, gdyż zamierzamy wszystkie pasujące do danego wzorca wartości zachować do późniejszego użycia. W tym przypadku przekazujemy je do skryptu PHP jako argument.
Każda para nawiasów z wyrażeniami umieszczana jest w odpowiedniej zmiennej. Jej nazwą jest kolejny numer nawiasu poprzedzony znakiem dolara. Przykładowo, pierwszy oznaczony fragment będzie dostępny pod $1, trzeci pod $3 itp. Po wywołaniu adresu “produkty/12/” przeglądarka wyświetli zawartość strony będącej rzeczywiście pod adresem “informacje.php?id=12“. Oczywiście ten adres zostanie ukryty przed odwiedzającym.
Wielokrotne przekierowania
Gdy w opisanym we wcześniejszym przykładzie przypadku użytkownik wpisze adres w postaci “produkty/12” (pomijając końcowy ukośnik) to serwer zwróci błąd, gdyż nie posiada reguł przechwytujących takie zachowania.
Aby temu zapobiec, zastosujemy na początku regułę przekierowującą wszystkie żądania bez końcowego ukośnika dołączając go do nowego adresu.
RewriteRule ^produkty/([0-9][0-9])$ /produkty/$1/ [R]
W wielokrotnych przekierowaniach na naszych serwerach istotna jest kolejność reguł, zgodnie z kolejnością linii pliku .htaccess. Podana przez nas reguła musi być dopisana linijkę przed opisaną we wcześniejszym rozdziale.
Całość wygląda następująco:
RewriteRule ^produkty/([0-9][0-9])$ /produkty/$1/ [R]
RewriteRule ^produkty/([0-9][0-9])/$ /informacje.php?ID=$1
Gdy użytkownik odwiedzi adres “produkty/21“, to w pierwszej kolejności zostanie przekierowany na “produkty/21/“, po czym zostanie mu zaprezentowana zawartość pliku informacje.php?ID=21.
Modyfikatory
Obecnie w kodzie reguły zdefiniowaliśmy na stałe ilość znaków wymaganych w linku.
Wywołanie “produkty/1/” jak również “produkty/100/” zakończy się błędem.
Aby nie definiować określonej ilości znaków potrzebnych do reguły, stosujemy tzw. modyfikatory. Spójrzmy na poniższą regułę:
RewriteRule ^products/([0-9]+)/$ /informacje.php?ID=$1
Po zakresie pojawił się modyfikator – znak plusa (+). Oznacza on, iż wymagany jest co najmniej jeden znak z danego zakresu. W tym przypadku pasować będzie do niego zarówno “produkty/1/” jak i “produkty/1000/”
Innymi modyfikatorami są: gwiazdka (oznaczająca zero lub więcej elementów zakresu) i znak zapytania (zero lub jeden znak z zakresu)
Tworzenie skrótów adresów
Dzięki wykorzystaniu mod_rewrite możemy utworzyć “skróty” do często używanych obszarów stron WWW.
Zakładamy, iż większość odwiedzających stronę sklepu z odzieżą z zamiarem kupienia spodni wpisze do przeglądarki:
www.firma.pl/spodnie
Jednakże oprogramowanie naszego sklepu wymaga linków w postaci:
www.firma.pl/odziez/spodnie
Korzystając z poniższej reguły:
RewriteRule ^spodnie(/)?$ /odziez/spodnie/ [R]
Wymusimy na odwiedzających przekierowanie do nowego adresu.