Żeby linki były ładne

Kiedyś, ale wcale nie w tak odległej przeszłości, w czasach, które można nazwać “przedgooglowymi, nikt nie zawracał sobie głowy wyglądem linków. Przekazywanie parametrów w linkach Powodowało, że miały one następujący format:
http://mojadomena.pl/index.php?p=1&id=12324&parametr=aqq
Niezbyt ładnie prawda? W pewnym momencie nadeszła era Google a z nią SEO i takie linki zaczęły być passe. Teraz wszyscy chcą mieć ładne albo inaczej przyjazne linki.

Kohana z definicji zapewnia całkiem zgrabny format linków i dla mniej wymagających może on być wystarczający. Standardowe linki w Kohana mają postać segmentową:
http://mojadomena.pl/index.php/kontroler/metoda/parametr1/parametr2/
Stosując odpowiednie nazewnictwo metod i parametrów można skomponować całkiem zgrabne i przyjazne linki, zjadliwe i dobrze indeksowane w Google. Od biedy wystarczy. Co jednak zrobić, gdy ktoś jest bardziej wymagający i chce mieć linki jeszcze ładniejsze? A poza tym chce ukryć prawdziwe nazwy kontrolerów i metod? Oczywiście jest na to rada.

Plik .htaccess

Po pierwsze można się w bardzo prosty sposób pozbyć segmentu ‘index.php’. który nieco psuje wygląd linka. Zacząć należy od edycji przykładowego pliku .htaccess, który dołączony jest do Instalacji Kohana. Należy tylko zmienić jego nazwę z example.htaccess na .htaccess i nieco zmodyfikować jedna linię. Jeśli umieścimy ten plik w tym samym katalogu co plik index.php. który uruchamia aplikację (i do którego prowadzi adres nasze aplikacji) to należy usunąć wiersz ‘RewriteBase /kohana/’ lub zamienić na ‘RewriteBase /’ (linia nr 5 na poniższym listingu).

# Turn on URL rewriting
RewriteEngine On

# Installation directory
RewriteBase /

# Protect application and system files from being viewed
RewriteRule ^(application|modules|system) - [F,L]

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT,L]

Plik konfiguracyjny

Następnie trzeba zajrzeć do pliku konfiguracyjnego config.php. Na ogół znajduje się on w lokalizacji ‘application/config/’. Jeśli go tam nie ma, to należy skopiować ten plik z katalogu ‘system/config/’ Następnie trzeba znaleźć linię zawierającą wpis:

$config['index_page'] = 'index.php';

i zamienić na:

$config['index_page'] = '';

I tym właśnie prostym sposobem pozbyliśmy się segmentu ‘index.php’ z adresów. Oczywiście należy zadbać, by w samej aplikacji nie było już linków zawierających ten segment, ale jeśli wszystkie tworzone są dynamicznie za pomocą metody url::base() to nie mamy się czym martwić.

Routing

No a co zrobić, żeby zamienić standardowe segmenty na kohanowych linków na jakieś ładniejsze? Trzeba się oczywiście postarać o dodatkowe mapowanie. Można to zrobić na dwa sposoby. Można to całkiem zgrabnie rozwiązać wpisując dodatkowe reguły do pliku .htaccess. Ja jednak wolę wykorzystać mechanizmy oferowane przez framework i zdefiniować sobie reguły w pliku konfiguracyjnym ‘routes.php’. Podobnie jak ‘config.php’, powinien on znaleźć się w lokalizacji ‘application/config/’. Standardowy plik ‘routes.php’ zawiera jeden wpis, który definiuje kontroler, który ma być wywołany jeśli w przeglądarce zostanie wpisany czysty adres bez dodatkowych segmentów np http://mojadomena.pl/

$config['_default'] = 'glowny_kontroler';

Wpis ten oznacza, że po wpisaniu adresu http://mojadomena.pl/ zostanie wywołana metoda ‘index’ kontrolera ‘glowny_kontroler’:
Na ogół chcemy aby po wpisaniu takiego adresu pojawiła się strona powitalna i załóżmy, że tak właśnie działa wywołana metoda. Wolelibyśmy zatem, aby zamiast linka ‘http://mojadomena.pl/glowny_kontroler/index’, na stronę główną prowadził link ‘http://mojadomena.pl/welcome’. Nic prostszego. Należy tylko do pliku ‘routes.php’ dodać linię:

$config['welcome'] = 'glowny_kontroler';

A jeśli chcemy by link ‘http://mojadomena.pl/o_mnie’ wywoływał metodę ‘about’ kontrolera ‘glowny_kontroler’ to załatwi to wpis:

$config['o_mnie'] = 'glowny_kontroler/about';

Jeśli jednak chcemy by w linkach przekazywane były parametry o dynamicznych i trudnych do przewidzenia wartościach, to trzeba do tego zaprząc wyrażenia regularne. Załóżmy, że mamy link do profilu użytkownika i chcemy by on wyglądał następująco:
http://mojadomena.pl/profil/username

gdzie segment ‘username’ będzie unikalnym nickiem użytkownika. Chcemy aby ten link wywoływał metodę ‘profil’ kontrolera ‘users’ i przekazywał metodzie parametr ‘username’. Standardowy link Kohana wyglądałby następująco:
http://mojadomena.pl/users/profil/username

Przekierowanie z naszego przyjaznego URLa, do mniej przyjaznego URLa Kohana zrealizujemy następującym wpisem:

$config['profil/([0-9a-zA-Z]*)'] = 'users/profil/$1';

Wyrażenie to wczytuje do zmiennej $1 string znajdujący się za segmentem ‘profil/’ i wstawia go do jako parametr do kohanowego linka. Przykłady można by mnożyć, linki mogą zawierać większą ilość parametrów, niektórzy wolą używać przecinków zamiast slashów itd itp. Sztuką jest tu tylko sprytne wykorzystanie wyrażeń regularnych.

Zatem do dzieła.

7 komentarzy do wpisu „Żeby linki były ładne”

  1. O ile Kohana2 ma niezły routing, to Kohana3 pod tym względem jest o wiele lepsza, choć w sporej ilości przypadków już taki routing jak w K2 wystarcza…

  2. A przyznam szczerze, że do Kohana v3 nawet się jeszcze nie przymierzyłam. Pewnie dlatego, że jak się zakochuję to na całe życie ;P

    A bardziej zaawansowane techniki też są możliwe. Kiedyś o tym napiszę.

  3. Tak z innej beczki – polecam Django:)
    Routing polega tam na podawaniu wyrażeń regularnych.
    Swego czasu również używałem kohanki V2 i mi domyślny routing wystarczał.

  4. tdroL: ale to nie jedyny powód. Jakoś nie mogę się przekonać i już :P Może jak Kv2 przestanie mi wystarczać, no ale na to się nie zanosi :P

Leave a Reply

%d bloggers like this: