Kompleksowe tworzenie stron internetowych, webdesign, aplikacje CMS

Przyjazne linki, czyli mod_rewrite w praktyce. Część 2

Artykuł został umieszczony w PHP Solutions Magazine, numer 06/2006.
Od 2006 roku wiele rzeczy zawartych w artykule mogło się zmienić.

Autor: Michał Gacki
Zobacz też: Część 1

...Wszystko działa, ale czy na pewno? Co będzie, jeśli w adresie wpiszemy tylko gallery/photo/, bez podawania numeru zdjęcia? Ujrzymy wtedy komunikat o braku katalogu, ponieważ przedstawiona reguła opisuje tylko trzypoziomowe adresy URL. Kod, który rozwiąże ten problem, będzie wyglądał jak na Listingu 4.

Listing 4. Poprawny zestaw reguł do tworzenia przyjaznych URL-i w przykładowej
galerii zdjęć


RewriteEngine On
RewriteRule ^([^-]+)/([^-]+)/([^-]+)/$ index.php?module=$1&function=$2&id= $3 [L,NC,NS]
RewriteRule ^([^-]+)/([^-]+)/$ index.php?module=$1&function=$2 [L,NC,NS]
RewriteRule ^([^-]+)/$ index.php?module=$1 [L,NC,NS]
RewriteRule ^([^-]+)/([^-]+)/([^-]+)$ index.php?module=$1&function=$2&id= $3 [L,NC,NS]
RewriteRule ^([^-]+)/([^-]+)$ index.php?module=$1&function=$2 [L,NC,NS]
RewriteRule ^([^-]+)$ index.php?module=$1 [L,NC,NS,QSA]

Co będzie, jeśli w adresie wpiszemy tylko gallery/photo/, bez podawania numeru zdjęcia? Ujrzymy wtedy komunikat o braku katalogu, ponieważ przedstawiona reguła opisuje tylko trzypoziomowe adresy URL. Kod, który rozwiąże ten problem, będzie wyglądał jak na Listingu 4.

W tym przypadku ważna jest hierarchia reguł: reguły muszą być ułożone w takiej kolejności, aby sobie nawzajem nie przeszkadzały. Przykładowo, gdyby pierwsza z nich była jednopoziomowa, to po wpisaniu gallery/photo/21 adres wskazywałby na index.php?module=gallery/photo/21, z czego wynika, że w pierwszej kolejności powinniśmy definiować reguły o największej liczbie poziomów. Zwróćmy też uwagę na flagę QSA w ostatniej regule, która by bez niej nie działała, gdyżwyrażenie regularne ([^-]+) nie może występować samodzielnie, jeżeli nie zdefiniowano RewriteBase.

Można wykorzystać nasz zestaw reguł nieco inaczej, np. niepodanie ID zdjęcia może prowadzić do listy wszystkich obrazków w galerii (w galeriach o większej liczbie poziomów może kierować np. na listę zdjęć o określonej tematyce) lub przekierować pod sam adres /gallery. Pozwala to niesamowicie uelastycznić funkcjonalność naszego serwisu.

Zauważmy też, że przy trzech poziomach zdefiniowaliśmy 6 reguł, podczas gdy wystarczy po jednej zasadzie na każdy z nich. Przyjrzyjmy się dokładnie trzem pierwszym regułom i sprawdźmy, czym różnią się od kolejnych trzech (nie licząc QSA w ostatnim wersie). W pierwszej trójce na końcu ostatniego wyrażenia występuje znak slash (/), a w drugiej nie – dzięki temu poprawne będą zarówno adresy, które się na niego kończą (np. http://www.mojadomena.pl/gallery/photo/ 21/), jak i te, które nie mają takiego zakończenia (np. http://www.mojadomena.pl/ gallery/photo/21).

Nic nie stoi na przeszkodzie, aby zachować taki sam schemat linków (np. wartość1/wartość2/wartość3) przy różnych parametrach (np. gallery/wartość1/ wartość2 kontra news/wartość2/wartość3).

Spójrzmy na Listing 5. Przedstawiona na nim zawartość pliku .htaccess pozwala na zachowanie wspomnianego schematu wartość1/wartość2/wartość3 bez względu na to, jakie zmienne mają zostać przekazane.

Listing 5. Zachowujemy schemat linków przy różnorodnych parametrach
RewriteEngine On
RewriteRule ^gallery/([^-]+)/([^-]+)/$ index.php?module=gallery&function=$1&id= $2 [L,NC,NS]
RewriteRule ^gallery/([^-]+)/$ index.php?module=gallery&function=$1 [L,NC,NS]
RewriteRule ^gallery/$ index.php?module=gallery [L,NC,NS]
RewriteRule ^gallery/([^-]+)/([^-]+)$ index.php?module=gallery&function=$1&id= $2 [L,NC,NS]
RewriteRule ^gallery/([^-]+)$ index.php?module=gallery&function=$1 [L,NC,NS]
RewriteRule ^gallery$ index.php?module=gallery [L,NC,NS]
RewriteRule ^news/([^-]+)/([^-]+)/$ index.php?module=news&action=$1&id= $2 [L,NC,NS]
RewriteRule ^news/([^-]+)/$ index.php?module=news&action=$1 [L,NC,NS]
RewriteRule ^news/$ index.php?module=news [L,NC,NS]
RewriteRule ^news/([^-]+)/([^-]+)$ index.php?module=news&action=$1&id= $2 [L,NC,NS]
RewriteRule ^news/([^-]+)$ index.php?module=news&action=$1 [L,NC,NS]
RewriteRule ^news$ index.php?modul=news [L,NC,NS]
RewriteRule ^([^-]+)/([^-]+)/([^-]+)/$ index.php?module=$1&option=$2&id= $3 [L,NC,NS]
RewriteRule ^([^-]+)/([^-]+)/$ index.php?module=$1&option=$2 [L,NC,NS]
RewriteRule ^([^-]+)/$ index.php?module=$1 [L,NC,NS]
RewriteRule ^([^-]+)/([^-]+)/([^-]+)$ index.php?module=$1&option=$2&id= $3 [L,NC,NS]
RewriteRule ^([^-]+)/([^-]+)$ index.php?module=$1&option=$2 [L,NC,NS]
RewriteRule ^([^-]+)$ index.php?module=$1 [L,NC,NS,QSA]

Jak widzimy, najwyżej w hierarchii reguł znajduje się zestaw zasad dla galerii. Jest on skonstruowany tak, że działa jedynie wtedy, gdy pierwszy pseudokatalog (w tym przypadku wartość1) wskazuje na słowo gallery. W tym przypadku Mod_Rewrite przepisuje nam adresy wg schematu z Tabeli 1. Drugi zestaw działa tylko wtedy, gdy pierwszy pseudokatalog wskazuje na słowo news. W tym przypadku adresy wyglądają jak w Tabeli 2.

Tabela 1. Przepisywanie adresów zaczynających się od słowa gallery
Adres Adres prawdziwy
gallery/wartość2/wartość3 lub gallery/wartość2/wartość3/index.php?module=gallery&function=wartość2&id=wartość3
gallery/wartość2 lub gallery/wartość2/index.php?module=gallery&function=wartość2
gallery lub gallery/index.php?module=gallery

Tabela 2. Przepisywanie adresów zaczynających się od słowa news
Adres Adres prawdziwy
news/wartość2/wartosć3 lub news/wartość2/wartość3/index.php?module=news&action=wartość2&id=wartość3
news/wartość2 lub news/wartość2/index.php?module=news&action=wartość2
news lub news/index.php?module=news

Tabela 3. Przepisywanie adresów zaczynających się od słowa, którym nie jest anigallery, ani news
Adres Adres prawdziwy
AdresAdres prawdziwy
wartość1/wartość2/wartość3 lub wartość1/wartość2/wartość3/ index.php?module=wartość1&option=wartość2&id=wartość3
wartość1/wartość2 lub wartość1/wartość2/index.php?module=wartość1&option=wartość2
wartość1 lub wartość1/index.php?module=wartość1

Jak widać, zamiast zmiennej function przekazywana jest zmienna action, ale oczywiście można także zamiast zmiennych module i id przekazywać cokolwiek innego – wszystko zależy od konstrukcji strony.

Dodatkowo, jeżeli pierwszym słowem w adresie nie jest ani gallery, ani news, to adresy są przepisywane w sposób przedstawiony w Tabeli 3.

W tym przypadku w adresie wyróżnia się zmienna option. Wspomnijmy tu jeszcze raz o całej hierarchii reguł. Gdybyśmy przed zestawami news i gallery wstawili ostatni zestaw z tego pliku, wszystkie adresy byłyby mu podporządkowane, czyli przekazywana byłaby zawsze zmienna option jako drugi parametr – tylko dlatego, że np. adresy gallery/photo/341 i news/read/53 pasują do tego schematu i byłyby z nim porównywane na samym początku. Jednak gdy schemat ten jest na końcu pliku, adresy porównywane są najpierw z pierwszymi zestawami, a później dopiero w przypadku niepowodzenia z ostatnim.

Adresy przepisywane wcale jednak nie muszą wyglądać jak katalogi. Można tak wykorzystać Mod_Rewrite, aby adresy były maskowane w postaci plików HTML, co wygląda jeszcze bardiej efektownie. Ogólnie wyglądałoby to tak, że schemat wartość1/wartość2/wartość3 wyglądałby np. następująco: wartość1-wartość2-wartość3. html, np. gallery-photo-21.html. Aby uzyskać taki efekt, należy przebudować poprzedni zestaw reguł w pliku .htaccess, co już nie będzie trudne (Listing 6).

Listing 6. Zestaw reguł umożliwiający stosowanie adresów udających pliki html
(np. gallery-photo-21.html)


RewriteEngine On
RewriteRule ^gallery-([^-]+)-([^-]+)\.html$ index.php?module=gallery&function= $1&id=$2 [L,NC,NS]
RewriteRule ^gallery-([^-]+)\.html$ index.php?module=gallery&function= $1 [L,NC,NS]
RewriteRule ^gallery\.html$ index.php?module=gallery [L,NC,NS]
RewriteRule ^news-([^-]+)-([^-]+)\.html$ index.php?module=news&action=$1&id= $2 [L,NC,NS]
RewriteRule ^news-([^-]+)\.html$ index.php?module=news&action=$1 [L,NC,NS]
RewriteRule ^news\.html$ index.php?module=news [L,NC,NS]
RewriteRule ^([^-]+)-([^-]+)-([^-]+)\.html$ index.php?modul=$1&opcja=$2&id= $3 [L,NC,NS]
RewriteRule ^([^-]+)-([^-]+)\.html$ index.php?module=$1&option=$2 [L,NC,NS]
RewriteRule ^([^-]+)\.html$ index.php?module=$1 [L,NC,NS]

Jak widzimy, reguł jest teraz mniej, ponieważ w poprzednim przykładzie występowały dodatkowe zasady, dzięki którym adres mógł się kończyć na slashu (/), ale nie musiał. Tym razem slashe nie są używane: zostały zastąpione myślnikami, a na końcu dodajemy sufix .html, udający rozszerzenie pliku. Jak już wspomnieliśmy, przed znakami specjalnymi należy stawiać znak backslash (\), dlatego widnieje on przed kropką. Dzięki plikowi .htaccess z Listingu 6, adresy URL wyglądają jak w Tabelach 4, 5 i 6. W rezultacie wszystko działa tak, jak w przypadku adresów w stylu katalogowym.

Tabela 4. Zasady przepisywania adresów galerii na pliki HTML
Adres Adres prawdziwy
gallery-wartość2-wartość3.htmlindex.php?module=gallery&function=wartość2&id=wartość3
gallery-wartość2.htmlindex.php?module=gallery&function=wartość2
gallery.htmlindex.php?module=gallery

Tabela 5. Zasady przepisywania adresów newsów na pliki HTML
Adres Adres prawdziwy
news-wartość2-wartość3.htmlindex.php?module=news&action=wartość2&id=wartość3
news-wartość2.htmlindex.php?module=news&action=wartość2
news.htmlindex.php?module=news

Tabela 6. Zasady przepisywania pozostałych adresów (nie newsów i nie galerii) na pliki HTML
Adres Adres prawdziwy
AdresAdres prawdziwy
wartość1-wartość2-wartość3.html index.php?module=wartość1&option=wartość2&id=wartość3
wartość1-wartość2.htmlindex.php?module=wartość1&option=wartość2
wartość1.htmlindex.php?module=wartość1

Pozbywanie się identyfikatora sesji

Jak już wspomnieliśmy, nawet najlepiej zbudowane adresy URL nic nie dadzą (w sensie pozycjonowania stron w wyszukiwarkach), jeżeli do linków doklejany będzie identyfikator sesji. W rezultacie nasze adresy, zamiast wyglądać jak gallery/photo/21 czy gallery-photo-21.html, będą wyglądały jak:

gallery/photo/21?PHPSESSID=accfcc299077b36817dc534c90588253

czy też:

gallery-photo-21.html?PHPSESSID=accfcc299077b36817dc534c90588253

Wyszukiwarka znajduje w nich pytajnik, znak równości oraz bezsensowny (dla wyszukiwarki) ciąg znaków przedłużających URL-a. Problem ten oczywiście występuje tylko i wyłącznie wtedy, gdy dany serwis korzysta z funkcji obsługi sesji w PHP. Aby wyszukiwarki nie doklejały numeru sesji do linków, należy w pliku .htaccess, zaraz pod RewriteEngine On, dodać następujące linijki:

Options FollowSymLinks
php_flag session.use_trans_sid off

Jeżeli zamiast strony zobaczymy błąd 500 (Internal Server Error), to znaczy, że opcja use_trans_sid jest ustawiona globalnie na on w konfiguracji serwera i nie możemy jej lokalnie zmienić. Pozostaje nam wtedy poprosić administratora, aby ustawił tę opcję lokalnie na off.

Praktyczne zastosowania Mod_Rewrite w systemach CMS

W praktyce, Mod_Rewrite ma wiele zastosowań w systemach typu CMS. Wymienimy i opiszemy najpopularniejsze z nich.

Tytuły podstron lub artykułów w adresach URL

Choć przyjazne linki nie są kluczem do wielkiego sukcesu w wyszukiwarkach, mają duży wpływ na pozycję strony. Aby dodatkowo umocnić się np. w Google, najlepiej jest przygotować adresy, w których widnieją nazwy podstron, tytuły newsów, itp. Jeżeli ktoś wtedy wpisze w Google hasło Bolek i Lolek na wycieczce, a my (np. mając witrynę poświęconą filmom animowanym) będziemy mieli zaindeksowaną podstronę o adresie bolek_i_lolek_na_wycieczce.html lub news/bolek_i_lolek_na_wycieczce, to możemy być pewni, że Google potraktuje naszą stronę lepiej niż inne, bez względu jaki webdesign prezentuje (czynniki takie jak przepisywanie linków są istotniejsze niż budowa kodu). Uzyskanie takiego adresu wymaga jedynie dodania prostej reguły w pliku .htaccess:

RewriteRule ^news/(.*)$ index.php?module=news&name=$1

lub, w przypadku linków z sufiksem .html:

RewriteRule ^news-(.*)\.html$ index.php?module=news&name=$1

Wyrażenie regularne (.*) pozwala na zapisanie dowolnego ciągu znaków (również spacji), więc teoretycznie adres moglibyśmy zapisać jako news/Bolek i Lolek na wycieczce, aczkolwiek nie jest to zalecane, gdyż przeglądarki i wyszukiwarki różnie interpretują spacje. Powyższy przykład może już praktycznie działać, o ile system CMS na naszej witrynie potrafi odnaleźć artykuł po nazwie zawartej w zmiennej, nie potrzebując ID. Mało który system CMS ma jednak funkcje typu GetIdFromName(nazwa), a my nie będziemy się teraz zagłębiać w ich tajniki.

Jest jeszcze jeden problem dotyczący powyższego przykładu – mianowicie znaki specjalne oraz polskie znaki diakrytyczne, akcenty (np. włoskie czy francuskie), niemieckie umlauty, itd. Znaki specjalne najlepiej zamienić na myślniki, a narodowe – na wersje łacińskie. Spacje zastąpimy znakami podkreślenia (_), zaś wszystkie litery uczynimy małymi.

Dzięki napisanej w PHP funkcji replace_titles(), którą przedstawiamy na Listingu 7, możemy zamienić zdanie Mały jeż je sobie jabłko, które jest zepsute na maly_jez_je_sobie_jablko,_ktore_jest_zepsute.

Listing 7. Funkcja replace_titles(), która zmienia wielkość liter i usuwa znaki narodowe

<?php
function replace_titles($text){
// tablice
$search =array(' ', '/', '\'', '&', '%', 'ć', 'ś', 'ą', 'ż', 'ó', 'ł', 'ś', 'ż', 'ń', 'ę',);
$replace=array('_', '-', '-', 'and', 'procent', 'c', 's','a', 'z', 'o', 'l', 's', 'z', 'n', 'e',);
// Zamiana wszystkich liter w stringu na małe
$text = strtolower($text);
// Zamiana znaków w stringu na znaki html
$text = html_entity_decode($text);
// Zamiana znaków z tablic
$text = str_replace($search, $replace, $text);
// Zwracanie tekstu oczyszczonego ze znakow specjalnych i narodowych
return $text;
}
?>

Działanie tej funkcji opisaliśmy w komentarzach. Oczywiście, tablicę ze znakami można powiększyć lub dostosować do innych języków (my jako przykładu użyliśmy polskich znaków diakrytycznych). Zastosowanie tej funkcji w systemie CMS jest proste. Załóżmy, że za wyświetlanie newsów odpowiada plik news.php. Po pierwsze, należy umieścić tę funkcję najlepiej zaraz na początku tego skryptu. Po drugie, wystarczy odszukać szablon dla linku (zakładamy, że CMS nie korzysta z systemu szablonów w celu ustalenia wzorca dla linków, tylko ze zwykłych zmiennych PHP), który wygląda mniej więcej tak:

<a href=”index.php?module=news&amp; id=<?=$id?>”><?=$title?></a>

Ten szablon należy zamienić na umożliwiający tworzenie przyjaznych URL-i przy użyciu naszej funkcji, której dla adresów udających katalogi użyjemy w następujący sposób:

<a href=”news/<?=$id?>/<?= replace_titles($title)?>”><?= $title?></a>

Natomiast w przypadku tych, które udają pliki, szablon będzie wyglądał następująco:

<a href=”news-<?=replace_titles( $title)?>-id<?=$id?>/”><?=$title?></a>

Nasz schemat przy adresach katalogowych będzie więc wyglądał tak: news/ ID/nazwa_newsa, a przy plikowych: news-nazwa_newsa-idID.html. Teraz, aby ukończyć nasze dzieło, dodajemy do pliku .htaccess następującą regułę (dla schematu katalogowego):

<a href=”news/<?=$id?>/<?= replace_titles($title)?>”><?= $title?></a>

Natomiast w przypadku tych, które udają pliki, szablon będzie wyglądał następująco:

RewriteRule ^news/([^-]+)/(.*)$ index.php?modul=news&id=$1 [L,NC,NS]

Przekazuje ona tylko ID do zmiennej id jako słowo. Drugi parametr może być dowolnym ciągiem znaków i nie musi być przekazywany, ponieważ do rozpoznawania newsa wystarczy samo ID.

Ta sama reguła dla schematu plikowego będzie wyglądała następująco:

<a href=”news/<?=$id?>/<?= replace_titles($title)?>”><?= $title?></a>

Natomiast w przypadku tych, które udają pliki, szablon będzie wyglądał następująco:

RewriteRule ^news-(.*)-([^-]+)\. html$ index.php?modul=news& id=$2 [L,NC,NS]

Również ta reguła przekazuje tylko ID do zmiennej id, lecz tym razem jest ono ustawione jako drugi parametr, w związku z czym jest przekazywane jako $2. Przypomnijmy, że parametr $1 nie musi zostać użyty. Nie będziemy od nowa podawali tabel z przykładami przepisywania adresów, bo można to łatwo wywnioskować samemu. Oczywiście, użyliśmy przykładów testowych – chcąc je wdrożyć w działających systemach CMS należy mieć jakąś wiedzę na temat PHP.

Zastosowanie przyjaznych linków w popularnych systemach CMS

Pokażemy teraz, jak wdrożyć przyjazne URL-e w popularnych CMS-ach opartych na platformie Nuke (PostNuke, MDPro, PHP-Nuke, enVolution, itp.). Są one kompatybilne z modułem generowania layoutu o nazwie AutoTheme (MDPro i PHP-Nuke mają go nawet w standardowej instalacji). Jest on obecnie najczęściej używanym systemem szablonów dla tych CMS-ów. Moduł ten umożliwia już włączenie przyjaznych linków w ustawieniach. Niestety, są to tylko linki w stylu plikowym – dobrze, że możemy chociaż wybrać sufix (domyślnie do wyboru mamy .html, .htm i .phtml). Po uruchomieniu zamiany linków na przyjazne, wystarczy przekopiować do katalogu głównego jeden z gotowych plików .htaccess, które są dostarczane razem z modułem. Nazwy tych plików zaczynają się od sufiksu, więc jeżeli wybierzymy .phtml, kopiujemy plik phtml.htaccess do głównego katalogu strony i zmieniamy jego nazwę na .htaccess. Po tym zabiegu domyślne schematy przyjaznych linków zaczną działać. Naszym celem jest jednak opisanie, jak te schematy przerobić i ustawić tak, aby w linkach do newsów były nazwy tych ostatnich.

Wspomniane systemy portalowe w katalogu modules/News/ mają plik funcs.php. Odpowiada on za generowanie linków w systemie newsów. Otwieramy go i wstawiamy w nim opisaną już funkcję zamiany tytułów (replace_ titles()) z Listingu 7, zaraz po komentarzu autora. Następnie odnajdujemy w funcs.php komentarz:

// Allowed to read full article?

i wstawiamy pod nim:

$nazwa_newsa = replace_titles($info[title]);

Zmienna $nazwa_newsa będzie wywoływała funkcję replace_titles() i stosowała ją wobec tytułu newsa podanego w zmiennej $info[title]. Poniżej wstawionego przez nas kodu widnieje linijka:

if (pnSecAuthAction(0, $component, $instance, ACCESS_READ)) {

Pod tym kodem powinna być umieszczona definicja zmiennej $fullarticle. Zamieniamy całą linijkę z tą definicją na:

$fullarticle = $news_name.'-id'.$info[sid].'.html';

Dzięki temu link do newsa będzie teraz wyglądał następująco: nazwa_newsaid31. html, gdzie liczba 31 jest przykładowym ID newsa. Oczywiście sufix .html należy zamienić na wybrany wcześniej przez nas. Pozostało jedynie dodanie reguły w naszym pliku .htaccess, która powinna być ustawiona jako pierwsza:

RewriteRule ^(.*)-id([0-9]+)\.html$ modules.php?op=modload&file=article&sid=$2 [L,NC,NS]

Dzięki temu wszystko będzie już działać. Zauważmy, że w tym przypadku dla ID użyliśmy wyrażenia regularnego, które zezwala na wprowadzenie tylko danej liczby.

Można dodatkowo zmodyfikować domyślny schemat generowania linków w AutoTheme. Standardowo są to angielskie odpowiedniki modułów działających z tymi CMS-ami. Aby je zmodyfikować w dowolny sposób, należy otworzyć plik modules/AutoTheme/extras/nazwa_używanego_ systemu_cms/autourls.ext.php.

W pliku tym widzimydwie tablice - $search i $replace oraz funkcję preg_ replace(), która zamienia wszystkie adresy według wyrażeń z tablic. Zatem aby zmienić schemat linków, należy zmodyfikować tablice, które sobie odpowiadają na zasadzie, że pierwsza pozycja z tablicy $search jest zamieniana na pierwszą z tablicy $replace, druga na drugą, itd.; dlatego też obie tablice mają tę samą ilość pozycji. Sposób edycji pokażemy na przykładzie jednej z pozycji tablicy $search:

$prefix . 'index.php\?newlang=([\wd\.:\_/]+)”|',

Jak widzimy, w miejscu, w którym można wstawić wartość zmiennej w URL-u, znajduje się wyrażenie ([\w\d\.\:\_\/]+), którego rezultat po przetworzeniu przez funkcję preg_replace() jest oznaczony pod nazwą $1, którą musimy umieścić w tablicy $replace. Odpowiedni wpis w tablicy $replace będzie więc wyglądał następująco:

'”changelang-$1.'.$autourlsext.'”',

Zmienna $autourlsext oznacza sufix.

Nie mamy jednak zamiaru opisywać szczegółowo modyfikacji CMSów i ich modułów, dlatego też nie będziemy się w to dalej zagłębiać. Ograniczymy się do pokazania, jak powinny wyglądać nowe pozycje. Przykładowo, jeśli chcemy dodać pozycję index.php?module=wartość1& file=wartość2, to przed znakiem zapytania należy wstawić slash, a znak & zastąpić wyrażeniem &(?:amp;)?, które jest warunkiem typu lub: zadziała i wtedy, gdy w linku jest znak & i wtedy, gdy znajduje się tam & (poprawna wersja). Wartość1 i wartość2 należy zastąpić wyrażeniem ([\w\d\.\:\_\/]+), a na końcu pozycji umieścić znaki "|. Całość powinna wyglądać następująco:

$prefix.'index.php\?module=([\wd\.:\_/]+)&(?:amp;)?file=([\wd\.:\_/]+)”|'

Na koniec, aby wszystko działało poprawnie, należy zmodyfikować reguły w pliku .htaccess tak, aby były one zgodne z pozycjami pliku autourls. ext.php. Miejmy nadzieję, że nie będzie z tym już problemów. Efekt zastosowania przyjaznych linków w systemie CMS można zobaczyć chociażby na obecnej stronie.

Podsumowanie

Przedstawiliśmy Ci, jak w praktyce zastosować reguły Mod_Rewrite i opisać je za pomocą wyrażeń regularnych. Użyte przez nas przykłady powinny dać Ci wyraźne wskazówki, jak postępować. Wszystkie z nich zostały sprawdzone na kilku serwerach i działają, dlatego jeżeli którykolwiek z nich nie będzie zwracał oczekiwanego wyniku, może być to wyłącznie winą serwera. Wszystko zależy bowiem od konfiguracji Mod_Rewrite na serwerze, która bywa błędna.

Jednocześnie pamiętajmy, że moduł Mod_Rewrite jest na tyle potężny, że nie sposób streścić wszystkie jego możliwości nie tylko w jednym artykule, ale nawet w całym numerze pisma. Życzymy zatem poprawnych reguł, zadowolenia użytkowników oraz wysokich pozycji w wyszukiwarkach dzięki zastosowaniu Mod_Rewrite.

Autor: Michał Gacki

Przeczytaj też: Przyjazne linki, czyli mod_rewrite w praktyce. Część 1

Zaufali nam:

i wielu więcej

Nowości »

Postanowiliśmy umieścić poradniki dotyczące tworzenia stron WWW, które opublikowaliśmy kilka lat temu na łamach magazynu PHP Solutions. Są to artykuły prasowe, które od dziś będzie można przeczytać online i zastosować w praktyce. Jeśli jesteś początkującym programistą lub chcesz zacząć swoją przygodę z programowaniem, zapraszamy do lektury. więcej nowości >