Generowanie bezpiecznych adresów www dla SEO
08 listopada 2008
Standardem stają się ładne, oparte o .htaccess, adresy stron internetowych, tworzone według zasad SEO (Search Engine Optimization - Pozycjonowanie stron internetowych). Przykład to chociażby ten blog. Adres tego wpisu wygląda tak:
-
http://www.tarnaski.eu/blog/generowanie-bezpiecznych-adresow-www-dla-seo
Ale to tylko "przykrywka". Sprytny sposób ukrycia prawdziwego adresu, który prezentuje się tak:
-
http://www.tarnaski.eu/blog/?p=458
Który link wygląda ładniej?
No właśnie... Wyszukiwarki typu google też wolą ten pierwszy
Jednak aby mieć takie adresy trzeba spełnić kilka warunków. Potrzebujemy między innymi funkcji, która zamieni dowolny ciąg znaków na coś co będzie bezpieczne i akceptowalne przez wszystkie wyszukiwarki i przeglądarki Internetowe. Czyli coś co zamieni "Generowanie bezpiecznych adresów www dla SEO" na "generowanie-bezpiecznych-adresow-www-dla-seo". I tym właśnie się zajmiemy
Problem w takiej funkcji jest tak naprawdę tylko jeden i nie wszystkich dotyczy. Chodzi tu o narodowe znaki diakrytyczne. Panuje powszechna opinia, że bezpiecznie byłoby ich nie używać w adresach stron. Jeżeli masz pewność, że napotkasz u siebie tylko na wąską grupkę znaków, które jesteś w stanie samemu wypisać to problemu nie ma. Wystarczy zadbać o ich zamianę np. za pomocą funkcji strtr i po kłopocie. Wygląda to mniej więcej tak:
Można byłoby nawet od razu wszystko zamieniać na małe litery bo w adresie lepiej unikać wielkich liter. Oczywiście w powyższym przykładzie należy pamiętać o zapisaniu pliku PHP w odpowiednim kodowaniu. Czyli jeżeli ciąg znaków w zmiennej $tytul jest kodowany w ISO-8859-2 to plik (a przede wszystkim polskie znaki diakrytyczne wypisane w funkcji strtr) muszą być również zapisane w ISO-8859-2.
Nie jest to jednak najlepszy sposób a już na pewno nie uniwersalny.
W Drupalu zdecydowanie najpopularniejszym modułem służącym do automatycznego generowania ładnych adresów jest Pathauto. Tam rozszerzono metodę, którą pokazałem powyżej. Pod tym adresem jest pliczek tekstowy w którym znajdują się wszystkie (chyba wszystkie
) znaki w UTF-8 i ich "bezpieczne" odpowiedniki. Wystarczy, tak jak robi to moduł Pathauto, parsować ten plik i zamieniać odpowiednie znaki.
Zaletą tego rozwiązania jest fakt, że mamy 99% pewności, że wszystko zostanie odpowiednio zamienione (nawet takie wynalazki jak np. chińskie znaczki). Wada to bardzo niska wydajność. Plik jest dużych rozmiarów, wielokrotne odczytywanie go to duże obciążenie serwera. Na drupal.org zaleca się okrojenie go (pamiętaj aby użyć do tego edytora, który pracuje w UTF-8) i zostawienie tylko tych znaków, które uważamy, że mogą zostać użyte na naszej stronie. Niestety w ten sposób wracamy do punktu wyjścia.
Wreszcie, całkiem przypadkiem, trafiłem na rozwiązanie proste i godne polecenia. Wymagania to włączona obsługa iconv na serwerze ale z tym już rzadko jest problem. Znalazłem też informacje, że z powodu błędnej konfiguracji niektórych maszyn, nie zawsze ten sposób działa. Sam nie napotkałem na żadne problemy ale przed użyciem tej funkcji radzę zawsze przetestować ją na własnym podwórku
Gdyby jednak były jakieś problemy to należy pokombinować z funkcją setlocale i ustawić ją np. tak:
Jeżeli nadal będą błędy to pokombinuj z innymi ustawieniami. Gdyby jednak nic nie pomagało to zawsze można wrócić do sposobów, które opisałem powyżej
A teraz funkcja:
-
function oczysc_adres($string) {
-
-
return $string;
-
}
Wszystko rozgrywa się w drugiej linijce. Za pomocą iconv zamieniamy znaki UTF-8 na zwykłe ASCII. Tylko jedna linijka i działa
Testowałem to na tekstach polskich, czeskich, niemieckich itp. Nigdzie nie napotkałem problemów. Jeżeli coś nie będzie mogło być skonwertowane to w tym miejscu pojawi się znak zapytania '?', który w dalszej części funkcji i tak zostanie usunięty.
Reszta linijek to już moja zabawa aby ciąg znaków był odpowiednio sformatowany.
4 linia - zamiana wszystkich liter na małe
5 linia - zamiana najczęściej spotykanych znaków na myślniki
6 linia - usunięcie z początku i końca naszego ciągu innych znaków niż litery i cyfry
7 linia - zamiana wszystkiego co nie jest literą lub cyfrą na myślnik
8 linia - usunięcie wielokrotnych wystąpień myślnika następujących po sobie na pojedyncze myślniki
W ten oto sposób dostajemy uniwersalny sposób generowania ładnych i przyjaznych adresów URL. Pamiętaj, że cały ten wpis na blogu dotyczy kodowania UTF-8, które gorąco polecam. Jeżeli u Ciebie jest inne kodowanie to musisz dostosować powyższe pomysły do własnych potrzeb lub zmienić kodowanie.
Blog przede wszystkim o Internecie i mojej pasji jaką jest tworzenie stron www. Ale nie ograniczam się do jednej tematyki, piszę o wszystkim o czym mam ochotę :-)
MajareQ napisał: 11.01.09 o godzinie 5:56
Bardzo świetny artykuł i bądź pewien, że z niego skorzystam
Michał napisał: 15.04.09 o godzinie 16:17
Kolejny raz kilka funkcji sie przydało, Dzięki
Kredyty napisał: 24.05.09 o godzinie 12:23
Dobry spodób
MŁK napisał: 22.03.10 o godzinie 21:59
A w Joomli! jest jeszcze prościej. Wystarczy w zapleczu w menu konfiguracja globalna/system zmienić wszystkie pozycje po prawej stronie stronie (oprócz ostatniej na „tak”) następnie dodać do .htacces wpis: RewriteBase / . To szybko zmieni adresy. (I kolejny raz udowodniłem, że Joomla! jest lepsza od całej paczki CMS-ów razem wziętych)
MariuszT napisał: 23.03.10 o godzinie 11:38
Nie zrozum mnie źle ale Joomla mnie średnio interesuje
Skupiam się na konkretnych rozwiązaniach programistycznych bo najczęściej mam konkretne potrzeby/zlecenia i piszę wszystko sam. Mimo to oczywiście bardzo się cieszę, że w Joomli jest to dobrze rozwiązane
gosc napisał: 23.04.10 o godzinie 1:05
Dobrze, wiem jak oczyścić stringa, ale jaki jest gł. mechanizm automatycznego tworzenia przyjaznych linków??
gosc napisał: 23.04.10 o godzinie 1:06
BTW. masz opóźniony czas bo jest 02:05
pozdrawiam
MariuszT napisał: 23.04.10 o godzinie 2:21
Mechanizm tworzenia linków musisz sobie wymyślić sam. Przecież każda strona jest zbudowana inaczej i każdy silnik musi mieć inaczej zaimplementowane różne metody.
Z napisał: 16.05.10 o godzinie 9:55
Dobry sposób, stosuję podobne rozwiązanie od 2 lat