Przyjazne linki
W jednym z moich ostatnich postów (mod rewrite) opisałem jak rozszyfrować przyjazne linki poprzez użycie mod rewrite, a teraz przyszła pora na zaprezentowanie w jaki sposób je utworzyć.
Do wygenerowania linku wykorzystujemy przeważnie tytuły dokumentów czy nazwy produktów. Nie możemy jednak użyć ich bezpośrednio, należy pozbyć się różnego rodzaju zbędnych znaków jak cudzysłowy, przecinki, dolary itp., a spacje należy zamienić na myślniki. Dodatkowo musimy przekonwertować odpowiednio nasze polskie znaki diakrytyczne.
Przed nami jeszcze jedna decyzja, czy przyjazne linki powinny zawierać identyfikator nadany przez bazę danych? Wg mnie owszem, zyskujemy szybsze wyszukiwanie po bazie danych oraz znikają niepotrzebne problemy przy odnajdywaniu strony w przypadku zmiany nazwy linku.
Przejdźmy do utworzenia naszego przyjaznego linku. Najpierw interpretujący kod mod rewrite, a potem kod php.
RewriteEngine On RewriteBase / # www.adresstrony.pl/tytul-artykulu,d20.html RewriteRule ^[a-z0-9\-]+,d([0-9]+)\.html$ ?a=dokument&documentId=$1
Tutaj należałoby wspomnieć, że slash na początku $sURL powinien być pobierany z konfiguracji, a nie ustawiony na stałe. Jak zauważyli koledzy w komentarzach, znacznika <base /> nie powinno już się używać ponieważ jest on przestarzały.
Na koniec jeszcze jeden przykład implementacji, ale tym razem w smarty. W parametrach można przekazać tablicę, albo pojedyncze parametry.
Słowa kluczowe: PHP, Techblog, google, mod rewrite, przyjazne linki, seo, artykuł, blog

Komentarze i opinie
co do wywalenia pewnych znaków to się zgodze - ale zamiana znaków diakrytycznych jest imho bezcelowa - w niczym nie przeszkadzają one w adresie linków - wszystkie nowe przeglądarki radzą sobie z linkami w standardzie unicode
Całkiem ciekawy opis, tylko jedno zastrzeżenie:
z tym basehref... niby to działa, ale AFAIK w specyfikacji html`a tego nie ma.
devnul: Przeglądarki łapią takie adresy, ale wejdź Firefoksem np. na polską Wikipedię. Pasek adresu nie jest za piękny... :P
Ogólnie przyjęło się, że adresy zapisujemy za pomocą czysto łacińskiego alfabetu. Nie ma sensu zmieniać konwencji. No i przyznasz, że śmiesznie wygląda taki adres: http://ru.wikipedia.org/wiki/Заглавная_страница :-).
Dodatkowo, jeśli chcemy rozbudować naszą aplikację o obsługę innych "dziwnych" języków poza naszym ojczystym, polecam użycie gotowych rozwiązań takich, jak utf8_to_ascii (http://www.files-library.com/files/PHP-UTF-8.html). Jedną linijką zamienimy tekst "Русскоязычная версия" na "Russkoiazychnaia viersiia" . Potem potraktować to funkcją prepareURL i gotowe. :)
@WZS: hmm, znalazłem: http://www.w3.org/TR/html401/struct/links.html#h-12.4
@RazorJack: ano :)
Odnośnie adresów ze znakami innymi niż te wchodzące w skład alfabetu łacińskiego polecam przeczytać artykuł http://www.w3.org/International/articles/idn-and-iri/
Funkcje wygladają ok, ale co do pierwszego listingu:
w clearDiacritics zamieniasz wszystkie litery na 'bezogonkowe' np. ł > l, Ł > L . A później, wszystko to na male litery.
Czy nie lepiej byloby, najwpierw zmniejszyc do malych, a dopiero pozniej przepuscic przez clearDiacritics?
Pozdrawiam Marcin. :)
@Marcin: można, ale trzeba użyć wtedy mb_strtolower(), a ta funkcja posiada jako drugi argument kodowanie.. i jeśli nie ustawimy go to często nam nie zmienia na małe litery
co do zamiany znakow diakrytycznych, to chyba nie konieczne, a jesli juz to szybciej bylo by przy uzyciu funkcji strtr
Interesujący artykuł! Fajny blog!
> różnego rodzaju zbędnych znaków jak cudzysłowia, przeciniki
"Cudzysłowy" a nie "cudzysłowia", analogicznie jak "rowy" a nie "rowia".
A poza tym ciekawe.
Dzięki. Już poprawiłem.
fajny artykuł :)
Dzięki, przydało się.
Dzięki za artykuł, może teraz google zacznie lepiej indeksować xD
Dzięki za artykuł, może teraz google zacznie lepiej indeksować xD
Jak dla mnie to rewelacja, pomogło !!!
Właśnie będę próbował zrobić przyjazne urle na swoim forum. Ale już widzę że nie będzie to takie trudne. Pozdrawiam
Dzięki za art.
Zastanawia mnie jak zrobić www.adresstrony.pl/tytul-artykulu.html jak zauważyliście adres jest bez id ? ma ktoś pomysł jak to zrobić lub może jakiś link do strony gdzie jest to ładnie opisane.
Pozdrawiam
@Wernychora: dodajesz do bazy dodatkową kolumnę, nazwijmy ją "permalink", następnie wynik funkcji prepareURL() zapisujesz w tą kolumnę czy też ręcznie wpisujesz, jak Ci pasuje, a potem szukasz nie po id, tylko właśnie po "permalink"
Bardzo ciekawy artykuł. Zastosowałem go na swojej stronie. Działa bardzo dobrze, nie ma żadnych problemów.
Ten artykuł jest ekstra!! Wszystko mi działa jak należy :) Gorące podziękowania dla autora tego tutoriala.
Super temat! W koncu ktos dobrze opisal to zagadnienie ;-)
Ciekawy art, na pewno go zastosuje.
Artykuł rzeczywiście ciekawy, ale mam pytanie.
Dotąd miałem adresy "mało przyjazne". Przez rok czasu. Google dobrze je zindeksował. Teraz po zmianie powoli będzie indeksował nowe adresy, ale na pewno będzie sprawdzał też stare. Dajmy na to: http://www.stronka-sliczna.pl/tytul-artykulu,d20.html (stary adres) zamienię na http://www.stronka-sliczna.pl/tytul-artykulu.html (adres)
I klops! Bo google będzie znajdował pod starym i nowym adresem to samo, uzna to za duplicate content. Zgadza się? A to nie byłoby wskazane, bo gotów mi wlepić punkty karne.
@Sebastian: sprawa jest bardzo prosta, przekierowanie 301 :)
Świetny artykuł, gratuluje ;-)
jasne, że nie trzeba konwersować diaktry, jeśli stronka jest dla PL, to po co, tym bardziej, że temat tyczy linków PRZYJAZNYCH. Utf8 i idzie na cały świat bez problemów, google przy indeksacji stron oraz przeglądarki internetowe dobrze sobie już z tym radzą.
Dzięki za ten kod, wykorzystałem go w moim katalogu.
No fajnie ;D łatwiej było poszukać w google niż samemu klepać kod i sie wkurzać przy braku jednego średnika czy kropki ;D
Spoko tylko mam kilka uwag :
1 ) w PHP już jest zaimplementowana funkcja do zmiany znaków z tablicy asocjacyjnej i
nazywa się strtr() - więc nie ma potrzeby wykorzystywania do tego kilku innych funkcji co spowalnia kod
2) po co inicjować za każdym wywołaniem funkcji tablicę $aReplacePL , skoro można użyć jej jako statycznej...
function clearDiacritics($sText)
{
static $aReplacePL = array(
'ą' => 'a', 'ę' => 'e', 'ś' => 's', 'ć' => 'c',
'ó' => 'o', 'ń' => 'n', 'ż' => 'z', 'ź' => 'z', 'ł' => 'l',
'Ą' => 'A', 'Ę' => 'E', 'Ś' => 'S', 'Ć' => 'C',
'Ó' => 'O', 'Ń' => 'N', 'Ż' => 'Z', 'Ź' => 'Z', 'Ł' => 'L'
);
return strtr($sText,$aReplacePL);
}
3) używanie sprintf jest wolne - lepiej w tym przykładzie złożyć url za pomocą konkatenacji
np. "/$name,d$id.html"
Dzięki wielkie, sporo czasu tego szukałem i dopiero tutaj znalazłem to, czego potrzebowałem :)
świetna stronka! zapraszam na http://www.systemki.wordpress.com
A ja ciągle szukam sposobu na zamianę adresu podstrony na adres ze znakami diakrytycznymi. Mam napszykład podstronę www.domena.pl\mala a chcę mieć www.domena.pl\mała
Jak to najprościej zrobić? Mam server na apachu.
Nowy komentarz