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ą grupę 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
Jubiler napisał: 05.11.10 o godzinie 19:03
Witam, dziękuję za porady, spróbuję zrobić to samo dla mojej strony. Mam nadzieję, że poprawi się widoczność mojego serwisu. Mam zamiar wprowadzić niedługo wersję PHP. Pozdrawiam.
EASY napisał: 06.11.10 o godzinie 10:36
Dlaczego jak dam linka w utf to zamienia mi ą na ae. albo dlaczego jak przepuszczę tekst przez funkcję oczyść adres to ucina niektóre litery ś na przykład?
MariuszT napisał: 06.11.10 o godzinie 13:08
Coś się knoci z kodowaniem. Nie potrafię Ci pomóc, to jest temat rzeka, każdy serwer inaczej skonfigurowany itd. ;/ Kombinuj. Upewnij się na 100%, że tekst masz na pewno w UTF-8 i PHP jest również ustawione do pracy z UTF-8.
EASY napisał: 09.11.10 o godzinie 16:54
sprawdziłem tekst na 100% w utf-8 i w iconv wszystkie input/output ustawione na utf8 setlocale na pl utf8 i nie smiga
MariuszT napisał: 09.11.10 o godzinie 18:29
Przykro mi, haczyk tkwi w ustawieniach serwera ale nie potrafię odpowiedzieć co jest nie tak. Pamiętam, że na jakimś koncie sam męczyłem temat i w końcu się poddałem…
EASY napisał: 10.11.10 o godzinie 19:59
heh ale to jest XAMPP którego podobno ty również uzywasz. Mam najnowszą wersję.
To ci zagadka nie?
EASY napisał: 14.11.10 o godzinie 17:03
Może byś tak sprawdził SWOJĄ funkcje na swoim localhoście?
Ignorujesz swoich czytelników? Lubisz to, ze czekają na twoją odpowiedź? Bawi cię to?
MariuszT napisał: 14.11.10 o godzinie 19:45
Nie wiem jak dyskutować z takim zachowaniem.
Funkcja BYŁA sprawdzana. Działa cały czas na kilku serwerach i na moim localhost.
Opublikowałem ją żeby komuś pomóc. Z komentarzy i rozmów prywatnych wiem, że wielu osobom się przydała. Nie wiem natomiast czemu zakładasz, że ta pomoc to mój obowiązek?!
Widzisz na tym blogu jakieś reklamy czy inne elementy zarabiające dla mnie? Nie, nie ma takich. A więc pomagam bo chcę. I póki mogę to staram się odpowiadać na pytania innych.
Są jednak granice tej pomocy… Nie zamierzam robić kilkugodzinnego dochodzenia dlaczego rozwiązanie nie działa akurat u Ciebie. Dlaczego Twój problem ma stać się moim?! Pomagam do czasu gdy mogę lub gdy ktoś wykazuje jakąś inicjatywę. Jeżeli natomiast oczekuje się ode mnie, że zrobię coś za kogoś (bo mu się nie chce, nie douczył się etc.) to z miejsca opieprzam lub ignoruję takiego osobnika.
Daj mu palec to będzie chciał całą rękę i jeszcze przy okazji Cię pogryzie!
PS
We wpisie uczciwie zaznaczyłem, że na niektórych serwerach funkcja nie działa. Ewidentnie jest to wynik złej konfiguracji (lub szeroko rozumianej konfiguracji programowej) ale w swej bezradności uznałeś, że to moja wina…
Anna napisał: 03.12.10 o godzinie 22:29
@Easy – piszesz jakby autor bloga miał obowiązek Ci pomóc, a przecież jest to tylko jego dobra wola, że poświęca swój czas prywatny, a Ty zamiast „dziękuję” chcesz mieć wszystko na tacy podane. Kombinuj, a nie czekaj na gotowe.
Pio89 napisał: 14.12.10 o godzinie 13:40
Funkcja jak funkcja zwraca to co chcemy żeby zwróciła i filozofii w tym nie ma, ale jak zrobić żeby w pasku przeglądarki adresy wyglądały inaczej niż standardowo ? Nigdzie nie jest napisane,więc artykuł przydatny jest tylko dla części userów.
MariuszT napisał: 14.12.10 o godzinie 13:45
A co to znaczy „inaczej niż standardowo” ? Skoro „filozofii w tym nie ma” to powinieneś sobie poradzić ze zmianą np. myślnika na kropkę w adresach
Pio89 napisał: 14.12.10 o godzinie 15:30
Manipulacja ciągiem znaków to nie problem, zmiana myślników na cokolwiek też nie. Zamiana wyglądu adresów URL przy użyciu mod_rewrite również nie jest problemem, ale jak zrobić żeby adresy URL wyglądały ładnie bez użycia mod_rewrite?
MariuszT napisał: 14.12.10 o godzinie 15:44
Nie masz zbyt dużego pola do manewrów. Albo dany plik/katalog istnieje fizycznie na dysku i adres strony www odnosi się bezpośrednio do niego albo korzystasz z czegoś co „tłumaczy” serwerowi jaki jest prawdziwy adres tego o co właśnie poprosił użytkownik. Bez modułów Apache się nie obejdzie.
Są oczywiście pomysły pośrednie np. http://www.webtips.pl/topic/21.....d-rewrite/, możesz próbować w ten sposób. Ja bym jednak unikał takich sztuczek
Darchiv napisał: 13.10.11 o godzinie 17:36
Przepraszam, ale np. ńĘą to nie znaki diakrytyczne. Są to litery diakrytyczne, a znaki diakrytyczne to takie ładne kreseczki do pisania liter diakrytycznych
MariuszT napisał: 13.10.11 o godzinie 21:54
@Darchiv: Całe życie człowiek się uczy. Takie logiczne ale nigdy na to nie zwracałem uwagi. Z tego co widzę to bardzo powszechny błąd. Dzięki Ci za zwrócenie mi uwagi, teraz już będę pamiętał