Reklama tekstowa
Strony Internetowe, Ochrona Komputera, Materace Stelaże, Drewniane Płoty, Hotell Barcelona902 903
Artykuł: PHP - Mod_Rewrite
Co to jest mod_rewrite?
Mod_rewrite to moduł (zainstalowany na serwerze) posiadający jedną funkcję - Rewrite (przepisz), która pozwala na wiele rzeczy, m.in. na tzw. "maskowanie" linków, które mam zamiar w tym artykule opisać. Dzięki mod_rewrite można dynamicznie przepisywać linki, co umożliwia m.in. uzyskanie wyższej pozycji w wyszukiwarkach oraz szybszą indeksację podstron. Przykład użycia mod_rewrite: link galeria-zdjecie-1.html otworzy nam przykładowo index.php?modul=galeria&funkcja=zdjecie&id=1. Jak widać link zaczynający się od index.php z ustawieniem wielu zmiennych nie jest ani przyjazny dla oka, ani tym bardziej dla wyszukiwarek. Warto więc skorzystać z mod_rewrite i mieć możliwość zmiany url'i. Niestety większość serwerów nie wspiera tego modułu, jednak wszystkie firmy, z uwagi na użytkowników, powoli wprowadzają już tę usługę.
Maskowanie linków
Aby rozpocząć zabawę z tym modułem, musimy upewnić się, czy na serwerze zainstalowany jest mod_rewrite. Najlepiej sprawdzić najpierw phpinfo, chociaż niekiedy zdarza się, że nie ma tam informacji o modułach. W takiej sytuacji możemy napisać do administratora serwera i zapytać się go o to, czy moduł jest zainstalowany. Można też sprawdzić, czy mod_rewrite jest dostępny prostym kodem PHP:
<?
if (!empty($sprawdz_mod_rewrite)) { $rewrite_result = 1; } else { $rewrite_result = 0; } if ($rewrite_result == 1) { echo 'Mod_Rewrite jest zainstalowany na tym serwerze'; } else { echo 'Mod_Rewrite nie jest zainstalowany na tym serwerze lub jest błędnie skonfigurowany'; } ?>
Options +FollowSymLinks
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(test.php)$ test.php?sprawdz_mod_rewrite=1 [QSA]
RewriteRule ^$ test.php?sprawdz_mod_rewrite=1 [QSA]
</IfModule>
Teraz sprawdźmy wynik, jaki podaje nam test.php w przeglądarce. Jeśli nadal nie jesteśmy pewni (w co wątpię), czy nasz serwer obsługuje mod_rewrite, dowiemy się o tym już przy samym korzystaniu z modułu - wyświetli się po prostu błąd 404.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(test.php)$ test.php?sprawdz_mod_rewrite=1 [QSA]
RewriteRule ^$ test.php?sprawdz_mod_rewrite=1 [QSA]
</IfModule>
Czas w końcu zacząć. Załóżmy, że chcemy zmienić składnię linku index.php?modul=COŚ1&funkcja=COŚ2&id=COŚ2 na COŚ1/COŚ2/COŚ3. Jak już wcześniej mówiłem - mod_rewrite pozwala na zmianę linku w dowolny sposób, więc nawet "udawanie" katalogów, które tak naprawdę nie istnieją, będzie działać. Tworzymy plik .htaccess i dodajemy w nim:
RewriteEngine On
Ten kod odpowiada za włączenie funkcji RewriteEngine (przepisywanie). Następnie dzięki RewriteRule będziemy mogli tworzyć schematy przepisywania linków. Używanie RewriteRule jest proste - schemat wygląda tak: RewriteRule ^link_zamaskowany$ link_właściwy [opcje_dodatkowe]. Dodajmy zatem linijkę:
RewriteRule ^([^-]+)/([^-]+)/([^-]+)$ index.php?modul=$1&funkcja=$2&id=$3 [L,NC,NS]
Dzięki temu wywołanie index.php?modul=galeria&funkcja=zdjecie&id=3 będzie wyglądało tak: http://www.nazwadomeny.pl/galeria/zdjecie/3. Wygląda to jak kilka katalogów, jednak w rzeczywistości zmienne będą przekazane jak w zwykłym linku. Teraz moim zadaniem jest wytłumaczenie powyższej linijki. Zaczyna się ona oczywiście od RewriteRule, po czym należy wstawić znak ^, który rozpoczyna możliwość ustawienia sposobu przepisywania linku. Aby zakończyć schemat linku, wstawiamy znak $. W linku, który będzie przepisywany możemy wstawić zmienne pola. Aby to zrobić wstawiamy ciąg znaków ([^-]+) (można wstawić też ([0-9]+) lub (.*)). Jak widać stworzyłem schemat typu pole1/pole2/pole3 i tak będzie wyglądał nasz link. Po znaku $ należy wstawić spację, po czym napisać schemat linku właściwego. W naszym przypadku jest to index.php?modul=$1&funkcja=$2&id=$3, gdzie $1 oznacza pierwsze pole, $2 oznacza drugie pole, a $3 pole trzecie. Możemy zrobić także schemat index.php?id=$1&funkcja=$2&modul=$3, dzięki czemu link przepisany przybierze wartość 3/zdjecie/galeria dla zdjęcia o "id" 3 w module "galeria". Na koniec między znakami [ i ] wstawiamy opcje dodatkowe po przecinkach. Opcja NC oznacza nie zwracanie uwagi na wielkość liter, dzięki czemu link GALERIA/ZDJECIE/3 będzie działał tak samo jak galeria/zdjecie/3 czy gAlErIa/zDjEcIe/3. W przypadku większej ilości wpisów przydają się opcje OR (umożliwia, w przypadku gdy dana strona nie zostanie odnaleziona, przejście do kolejnego warunku), L (ustanowi linijkę jako ostatnią, dzięki czemu dalsze próby porównywania z innymi linijkami nie zostaną wykonane). Wartą uwagi opcją jest R, która przekierowuje link według podanej wartości, np.: aby utworzyć przekierowanie 301, dodajemy R=301.Jeśli mamy linki składające się z mniejszej ilości parametrów, np. index.php?modul=COŚ1&funkcja=COŚ2, index.php?modul=COŚ, najlepiej będzie dodać więcej reguł do pliku .htaccess. Stwórzmy zatem plik, który będzie wyglądał tak:
RewriteEngine On
RewriteRule ^([^-]+)/([^-]+)/([^-]+)$ index.php?modul=$1&funkcja=$2&id=$3 [L,NC,NS]
RewriteRule ^([^-]+)/([^-]+)$ index.php?modul=$1&funkcja=$2 [L,NC,NS]
RewriteRule ^([^-]+)$ index.php?modul=$1 [L,NC,NS,QSA]
W efekcie http://www.nazwadomeny.pl/news będzie zastępowało http://www.nazwadomeny.pl/index.php?modul=news, http://www.nazwadomeny.pl/news/czytaj - http://www.nazwadomeny.pl/index.php?modul=news&funkcja=czytaj, a http://www.nazwadomeny.pl/news/czytaj/1 - http://www.nazwadomeny.pl/index.php?modul=news&funkcja=czytaj&id=2. Oczywiście gdybyśmy mieli dla każdej podstrony inny parametr, np. dla modułu "news" parametr "id", a dla modułu "download" parametr "plik", dodajemy dodatkową linijkę w pliku .htaccess.
RewriteRule ^([^-]+)/([^-]+)/([^-]+)$ index.php?modul=$1&funkcja=$2&id=$3 [L,NC,NS]
RewriteRule ^([^-]+)/([^-]+)$ index.php?modul=$1&funkcja=$2 [L,NC,NS]
RewriteRule ^([^-]+)$ index.php?modul=$1 [L,NC,NS,QSA]
Dodawanie surfixu
Surfix - jest to nic innego jak jakiś element na końcu nazwy, więc dla przepisanego linku news.html surfixem będzie ".html" (nie będzie to rozszerzenie, ponieważ tak naprawdę plik news.html nie istnieje na serwerze). W celu dodania surfixu do naszych przyjnaznych linków lub zmiany ich schematu z COŚ1/COŚ2/COŚ3 na coś1-coś2-coś3.html dodajemy linijkę:
RewriteRule ^([^-]+)-([^-]+)-([^-]+)\.html$ index.php?modul=$1&funkcja=$2&id=$3 [L,NC,NS]
Tym razem zamiast "/" posłuży nam myślnik. Surfix dodajemy po znaku \ i przed znakiem $, np. ^([^-]+)-([^-]+)-([^-]+)\.asp$.
Usuwanie sesji
Jeżeli nasz sytem portalowy/forum czy jakikolwiek skrypt używa sesji (ciągu znaków, który przekazuje daną wartość zazwyczaj po "sid" [pełni też rolę utrzymywania zalogowanego użytkownika]), dodanie przyjaznych linków nie da nam lepszej indeksacji podstron czy wyższej pozycji w wyszukiwarkach, ponieważ link będzie wyglądał np. tak: news.html?sid=423b2af3b9e70dc90bb9d61b49dde2b8. Jak widać link jest długi i posiada już jakiś atrybut (w tym przypadku sid). Aby uniknąć takiego zjawiska należy dodać w pliku .htaccess zaraz pod RewriteEngine On:
Options FollowSymLinks
php_flag session.use_trans_sid off
Powyższy kod spowoduje wyłączenie lokalnie "doklejania" sesji do linków. Nie działa to jednak serwerach, w których konfiguracji session.use_trans_sid jest ustawione na "on". Wtedy zazwyczaj nic nie da się zrobić i dodanie tych linijek spowoduje pokazanie się błędu 500 (Internal Server Error).
php_flag session.use_trans_sid off
Efekt działania mod_rewrite widoczny jest na przykład na tej stronie. Mam nadzieję, że ten artykuł, pokazujący podstawy używania mod_rewrite, będzie przydatny. Pomyślnego przepisywania linków! :)
Dodano: 19 marca 2006, Idź do "Mod_Rewrite zastosowania praktyczne"



















