Tekst jeszcze jest niedopieszczony, ale pewnie i tak zapomnę go poprawić…

Link, odnośnik, adres, ścieżka, URL, URI…

Linki są interfejsem twojej strony. Gdy się chce otrzymać dane z twojego serwera należy podać mu odpowiednią ścieżkę.
Zadbaj, aby adresy wewnątrz twojej strony były równie porządne jak jej treść.

Dzięki dobrym linkom:

Przykład złych linków:

/index.php?strona=samochody&marka=15&typ=7
/news,0,2,0,432,77,0,0,0,2342.html
/dynamic/foo/cms/mainengine.asp?bar
/skrypt/9827492—napchany-ignorowany-tekst-do-spamowania-wyszukiwarek

Tak nie należy robić, ponieważ:

Uwaga: nie przerabiaj na siłę wszystkich argumentów query string na “ładne”. Jeśli parametry nie są hierarchiczne (np. sortowanie i numer podstrony), to powinny mimo wszystko pozostać w query string (jako argumenty po ?).

Przykład dobrych linków:

/samochody/ferrari/f1
/news/2004/07/28/skandal
/bar

Zalety tego rozwiązania (ponad te wymienione na początku tej strony):

Jak to zrobić?

Najbardziej oczywistym rozwiązaniem jest rozrzucenie plików po katalogach. Jednak takie rozwiązanie wymaga pracy na wielu tak samo nazywających się plikach (index.html, index.php, itp.) co może być niewygodne.

Remedium na te problemy jest mod_rewrite dla serwera Apache. Są odpowiedniki dla nginx, lighttpd, a nawet nowych wersji IIS. mod_rewrite służy do manipulacji adresami które orzymuje serwer. W szczególności potrafi przechwycić odwołania do wybranych (bądz wszystkich) adresów i przekazać je do skryptu. W ten sposób można nadal mieć stronę opartą o jeden plik index, a poprawnie reagującą na eleganckie adresy.

Uruchomienie mod_rewrite

Najprościej jest stworzyć plik .htaccess w głównym katalogu strony (zrobienie pliku o takiej nazwie pod Windows wymaga odrobiny sprytu), a w nim 2 linijki:

RewriteEngine On
RewriteRule .* /index.php

Pierwsza linijka uruchamia mod_rewrite. Druga określa jakie adresy mają być przechwycone i co ma być dla nich wywołane. Wzór określający adresy jest tzw. wyrażeniem regularnym. W tym przykładzie wszystkie adresy. Inne przykładowe wyrażenia regularne:

!(\.(jpg|jpeg|png|gif|ico)$) // adresy nie kończące się na .jpg, .jpeg, itd.
!(\.[^.]{3,4}$) // adresy nie mające 3 lub 4 literowej końcówki.
^strona/ // adresy zaczynające się od strona/
^favicon.ico$ // tylko adres favicon.ico

Drugi parametr, /index.php, oznacza poprostu plik index.php w głównym katalogu strony. Oczywiście może tu być inna ścieżka na serwerze.

A skąd skrypt ma wiedzieć jaką stronę chciał użytkownik? Otóż oryginalny adres można odczytać ze zmiennej środowiskowej REQUEST_URI, w PHP robi się to np. tak:

$adres = urldecode(stripslashes($_SERVER['REQUEST_URI']));

W dalszej obróbce adresu pomocna może być komenda explode