Bardzo ważnym elementem każdej strony – zwłaszcza dynamicznej są przyjazne linki. Poza rolą jaką odgrywają w pozycjonowaniu, jest to również bardzo duże udogodnienie dla użytkowników, którzy dzięki temu chętniej będą wracać na stronę. Wbrew pozorom nie jest to tak trudne, jak się wydaje.
Teoria czyli co i jak
Każda osoba przeglądająca internet na pewno kiedyś spotkała się z przyjaznymi linkami, jednak niewielu wie, co kryje się pod tą nazwą.
Dla niektórych może to brzmieć skomplikowanie, jednak jest to po prostu link skonstruowany w taki sposób, by łatwo można go było zapamiętać. Bardzo ciężko zapamiętać adres, który ma w sobie masę parametrów strona.pl/index.php?art=6127&kat=85&…. Nawet jeśli dodamy ten adres do zakładek, to ciężko się zorientować, do czego ten link prowadzi.
Dużo lepszym rozwiązaniem jest adres łatwy do zapamiętania np blogwebmastera.pl/tajemnice-pliku-htaccess.html. Prawda że o wiele łatwiejsze do zapamiętania? Aby coś takiego było możliwe, w bazie danych powinno znajdować się pole, które będzie zawierało przyjazny link czyli tajemnice-pliku-htaccess. Najlepiej, gdyby był on automatycznie tworzony na podstawie tytułu.
Oczywiście zdarza się, że ludzie podają kilku artykułom takie same tytuły. System nie powinien pozwolić, by dwa elementy miały ten sam przyjazny link. Aby się przed tym zabezpieczyć, można założyć, że tytuły artykułów muszą być unikatowe.
Jednak użytkownicy mogą próbować to obchodzić i dodawać jakieś dodatkowe znaki np spacje, tabulatory, myślniki itd. Dlatego trzeba zapamiętać, aby zawsze sprawdzać, czy podany przyjazny link istnieje w systemie. Jeśli istnieje, to najlepiej dodać na końcu kolejną liczbę lub zmusić użytkownika, by go poprawił. Dopóki przyjazny link nie zostanie poprawiony, artykuł nie zostanie opublikowany.
Przyjazne linki w .htaccess
Podstawowym elementem niezbędnym do działania przyjaznych linków jest Apache oraz plik .htaccess, który steruje jego pracą. Użyję tego pliku do tłumaczenia przyjaznego linku na dane, które zostaną zrozumiane przez skrypt PHP.
Dla przykładu prosty do zapamiętania adres http://domena.pl/katalog/artykul.html zostanie zamieniony na adres w którym przekażemy odpowiednie parametry do skryptu http://domena.pl/index.php?parametr1=katalog¶metr2=artykul.
Zamiana będzie odbywała się na podstawie wyrażeń regularnych. Jeśli nie znacie wyrażeń regularnych, to koniecznie powinniście je poznać. Zapraszam do lektury artykułu Wyrażenia regularne – łatwiejsze niż myślisz w którym tłumaczę co i jak.
W pliku .htaccess będą opisane wszystkie zasady tłumaczenia. Aby to zadziałało, niezbędny jest moduł mod_rewrite, który jest odpowiedzialny za przekierowania (w tym parsowanie przyjaznego linku) na podstawie zdefiniowanego wyrażenia regularnego.
Jeśli nie będzie zainstalowanego tego modułu, to serwer zwróci błąd 500 (Internal serwer error). Aby temu zapobiec, należy zamknąć w klauzuli IfModule wszystkie instrukcje, które wykorzystują ten moduł.
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^artykuly/([\w-]+)\.html$ index.php?typ=artykul&przyjaznyLink=$2 [L,NC] </IfModule>
Ten prosty przykład przekształca podany wcześniej przyjazny link na formę, która będzie zrozumiała dla każdego skryptu.
Komenda RewriteEngine steruje modułem i informuje serwer, czy danego katalogu (i podkatalogów) moduł dla ma być włączony czy nie. Każda strona posiada miejsce w którym są przechowywane zdjęcia oraz inne pliki. Nie ma potrzeby, aby stosować tam przyjazne linki, więc można ten moduł wyłączyć wpisując:
RewriteEngine off
Kolejna linia zaczyna się od komendy RewriteRule. Po niej znajduje się wyrażenie regularne, do którego ma zostać dopasowany adres z przyjaznym linkiem. Za wyrażeniem jest przekierowanie na stronę docelową. Działa podobnie jak funkcja PHP – preg_match.
Na końcu w nawiasie kwadratowym znajdują się przełączniki, które sterują pracą modułu dla danego dopasowania. Oto najważniejsze z nich:
- L – koniec przetwarzania
- NC – ignorowanie wielkości liter (Not Case sensitive)
- R – numer błędu, który ma zostać zwrócony
Przełączniki muszą być oddzielone przecinkami. W przeciwnym wypadku grozi nam słynna pięćsetka (Internal Serwer Error). Jeśli wyrażenie regularne nie zostanie dopasowane do adresu, to dana komenda zostanie pominięta i moduł przejdzie do kolejnej linii.
Omówienie przyjaznego linku na przykładzie
Oto przykładowy plik .htaccess, który rozłożę na części pierwsze:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC] RewriteRule ^http://%1%{REQUEST_URI} [L,R=301] RewriteRule ^(.*)?_=\d+$ $1 RewriteRule ^artykuly/([\w-]+)\.html$ index.php?typ=artykul&przyjaznyLink=$2 [L,NC] RewriteRule ^newsy/([\w-]+)\.html$ index.php?typ=news&przyjaznyLink=$2 [L,NC] </IfModule>
W tym przykładzie w trzeciej linii jest użyta klauzula RewriteCond. Jest to po prostu warunek. Po nim znajduje się zmienna, która w tym wypadku oznacza adres strony (bez http). Następnie znajduje się wyrażenie regularne z którym porównywana jest zmienna. Jeśli warunek jest spełniony, to komenda następująca po nim zostanie wykonana.
Nie raz zdarza się, że do adresów doczepiany jest niezrozumiały kod (?_=123489723498). Jest to stosowany przez jQuery sposób na wymuszenie na przeglądarce pobierania danych niezależnie od keszu (np skrypty). Aby ta końcówka w żaden sposób nam nie przeszkadzała, najlepiej się tego pozbyć. Za to odpowiada linia piąta.
Jak na pewno zauważyliście, na końcu tej linii nie ma żadnych przełączników. Zostały pominięte, ponieważ nie ma w tym wyrażeniu opisanych żadnych liter, więc przełącznik NC jest zbędny. Przełącznik L również jest zbędny, ponieważ chcemy aby adres był nadal sprawdzany.
Ostatnie linie opisują przyjazny link dla artykułów oraz newsów.
PHP
Można powiedzieć, że plik .htaccess i wyrażenia regularne to najtrudniejsza rzecz w przyjaznych linkach. Teraz przyszedł czas na oprogramowanie tego w skrypcie. Nie będę się tutaj rozpisywać i podawać przykładów.
Zasada polega na tym, aby porównać podany przyjazny link z tym, który jest w bazie, a następnie pobrać dane o wybranym elemencie.
Mam nadzieje, że po przeczytaniu tego artykułu, każdy będzie używał przyjaznych linków.