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:
- użytkownicy będą mogli łatwiej zapamiętać adres twojej strony, a nawet podstron,
- użytkownicy będą lepiej orientować się w organizacji twojej strony,
- twoja strona będzie mogła być bezproblemowo umieszczona w wyszukiwarkach, katalogach i podlinkowana na innych stronach.
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ż:
- Link jest zależny od konfiguracji serwera. Jeśli zmienisz skrypt php na stronę html, skrypt cgi albo jeszcze coś innego to adres się zmieni i wszystkie odnośniki do tego adresu staną się nieprawidłowe.
- Struktura strony jest “płaska”. Duże strony najczęściej są podzielone na hierarchiczne działy, czego taki adres dobrze nie odzwierciedla.
- Link jest nieczytelny. Przeciętny użytkownik go nie rozumie i nie jest w stanie zapamiętać, a nawet przepisać. Użytkownik nie jest w stanie przejść do innej podstrony przez zmianę adresu.
- Link zawiera znak
&
. To nie błąd, ale upierdliwość dla użytkowników kiepskich szablonów. W HTML każde wystąpienie znaku&
w tekście powinno się zamienić na&
, nawet w linkach.
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):
- Link jest możliwe krótki i jasny. Nie ma znaczenia jakiej technologii serwer używa, w każdej chwili możesz zmienić strony statyczne na skrypty i odwrotnie.
- Użytkownik może skrócić adres, żeby przejść do nadrzędnego działu (może mu w tym pomóc przeglądarka Opera (Ctrl+Backspace), Google toolbar dla IE, itp.)
- Link jest dodatkowym źródłem słów kluczowych dla wyszukiwarek (tylko bez przesady, bo zbyt nachalne ładowanie słów w URL-e da odwrotny efekt).
- Łatwo jest utrzymać linki w logicznym porządku. Jest większa szansa, że zostaną aktualne przez długi czas.
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