Ten blog nie jest już rozwijany. Wraz ze wszystkimi artykułami zostały przeniesiony pod adres wmroczkowski.pl

Czy chcesz przejść pod nowy adres?

piątek, 15 sierpnia 2008

Mod_rewrite, czyli przyjazne adresy URL z .htaccess

Często zdarza się, że nasze adresy URL do podstron zaczynają nabierać naprawdę przerażająco długiej długości, np. /index.php?id=galeria&sid=2008&ssid=wakacje. Z takim adresami często nie radzą sobie roboty indeksujące strony, dlatego część podstron może po prostu zostać nie dodana do indeksu. Oczywistym minusem tak długich adresów jest również ich nieczytelność. Tutaj z pomocą przychodzi nam moduł Apache'a - mod_rewrite. Przede wszystkim należy sprawdzić w pliku konfiguracyjnym Apache'a czy nasz serwer go obsługuje, szukamy więc linijki LoadModule rewrite_module modules/mod_rewrite.so. Jeżeli jest odhashowana to wszystko w porządku, w przeciwnym wypadku usuwamy hasha (#). Jeżeli oczywiście nie masz dostępu do pliku konfiguracyjnego to po prostu wykonaj w jakimś skrypcie php polecenie phpinfo(); i odszukaj części odpowiadającej za uruchomione moduły - powinieneś tam znaleźć wpis odpowiedzialny za mod_rewrite. Jeżeli go nie znajdziesz to musisz się skontaktować z administratorem w celu uruchomienia tego modułu.
Mod_rewrite korzysta z wyrażeń regularnych, oto najważniejsze z nich:
. Dowolny znak
^ Oznacza początek napisu
$ Oznacznik końca (c$ znaczy, że ciąg tekstowy musi zakończyć się na c)
+ Wystąpi jeden lub więcej razy
* Zero lub więcej wystąpień
? Zero lub jedno wystąpienie
! Negacja wyrażenia
( Rozpoczyna grupowanie (przetwarzanie ciągu znaków, jakby był to pojedynczy element)
[ Rozpoczyna klasę znaków, np. dopasowane do przedziału od 0 do 9, to definicja klasy [0-9]

Przykładowy wpis do .htaccess może wyglądać tak:
RewriteEngine on
RewriteRule ^index.html$ index.php [L]

Pierwsza linia powoduje uruchomienie mod-rewrite, natomiast w drugiej widzimy już użycie wyrażeń regularnych. Taki zapis oznacza, że jeżeli na serwerze mamy plik index.php to możemy się również do niego odnieść wpisując index.html. Jeżeli chodzi o atrybut [L] to jest to skrót od Last rule i oznacza on, że linia w której się znajduję jest ostatnią linią, czyli kolejne reguły nie będą dalej wykonywane. Dodatkowo możemy dopisać atrybut [NC], który oznacza że to czy adres będzie wpisany dużymi literami czy małymi nie robi żadnego znaczenia, tak więc wpisując domeda.com/STRONA1/index.php otrzymamy to samo co przy wpisie domeda.com/strona1/index.php.
Teraz zajmijmy się już konkretnymi przykładami. Załóżmy, że nasza strona znajduję się pod takim adresem: www.strona.pl/menu.php?id=4. Aby adres był czytelny dla użytkownika dobrze jakby był takiego formatu: www.strona.pl/menu-4. Aby otrzymać taki wynik wystarczy dodać do .htaccess następującą linkijkę: RewriteRule ^menu-([^-]+).html$ menu.php?id=$1. Teraz po kolei wyjaśnię ten zapis: ([^-]+) oznacza wszystkie znaki z wyjątkiem myślnika, w takim przypadku za wykluczenie odpowiedzialny jest znak ^, natomiast + oznacza wystąpienie znaku raz lub więcej razy. Jeżeli np. chcemy aby tam były umieszczone wyłącznie liczby to wpisujemy ([0-9]+) . Jeśli chodzi o okrągłe nawiasy oznaczają one zmienne - w tym przypadku to co jest w nawiasie w pierwszej części ciągu jest przenoszone do drugiej części do zmiennej $1 i wyświetlane w URL. Jeżeli nawiasów byłoby więcej to odpowiadałyby one kolejno zmiennym $1 $2 $3 itd.

Tutaj bardziej czytelny przykład:
RewriteEngine On
RewriteRule (aktualnosci)/(kraj)/([0-9]+) /wyswietl.php?what=$1&skad=$2&id=$3
#lub
RewriteRule (+)/(+)/([0-9]+) /wyswietl.php?what=$1&skad=$2&id=$3
#lub
RewriteRule ([a-z]+)/([a-z]+)/([0-9]+) /wyswietl.php?what=$1&skad=$2&id=$3

Zamieni on adres http://moja-strona.pl/wyswietl.php?what=aktualnosci&skad=kraj&id=108 na: http://moja-strona.pl/aktualnosci/kraj/108. Po więcej szczegółów odsyłam do dokumentacji Apachea.

Brak komentarzy: