Radosław Owczarek

Przyjazne linki, czyli Mod Rewrite dla praktyków

Ważnym elementem składającym się na funkcjonalną nawigację są przyjazne adresy stron. Przyjazne to takie, które „podobają się” zarówno użytkownikom, jak i wyszukiwarkom. Człowiek może je łatwo zapisać, zapamiętać i przeczytać, a robot wyszukiwarki zidentyfikować na ich podstawie strukturę serwisu i zaindeksować.
W artykule zebrane zostało kilka informacji dotyczących modułu rewrite serwera Apache, przydatnych dla początkujących.

W niniejszym artykule zamierzam poruszyć zagadnienie wykorzystania modułu rewrite serwera Apache dla generowania przyjaznych linków we własnym serwisie. Nie gwarantuje, że każdemu się uda przerobić swój serwis, tak by adresy były odpowiednie dla dobrego pozycjonowania przez wyszukiwarki, ale postaram się poprowadzić tak ten artykuł by każdy posiadał minimum odpowiedniej wiedzy.

Generalnie po przeczytaniu niniejszego tekstu powinieneś potrafić samodzielnie dokonać zmiany adresów postaci:
www.serwis.pl/index.php?zmienna1=a&zmienna2=b
na postać na przykład:
www.serwis.pl/index-a-b.php

Powodem, dla którego powstał ten artykuł, była maja praca nad tym problemem, a potem chęć podzielenia się swoimi wiadomościami z innymi by mogli zaoszczędzić trochę czasu. Cały problem z informacjami na temat przepisywania linków w serwisie na przyjazne wyszukiwarkom polega na tym, że bardzo rzadko informacje w sieci o module rewrite serwera Apache (plik .htaccess) są skorelowane z informacjami o faktycznym przepisaniu linków w posiadanym serwisie bez poprawiania w każdym miejscu gdzie są generowane odnośniki.

Ten artykuł w moim zamierzeniu ma łączy właśnie te informacje. Informacje tu zawarte nie są niczym twórczym i bazuję na tym, co jest dostępne w zasobach głównie for dyskusyjnych.

Co trzeba umieć:

  • dobra znajomość php – jeśli wykonałeś serwis sam to chyba nie ma problemu,
  • znajomość podstaw baz danych,
  • znajomość struktury linków serwisu,podstawy wyrażeń regularnych (teoria wystarczy),
  • jak manipulować serwerem Apache (httpd.conf).

Moduł Rewrite

Aby w ogóle korzystać z możliwości zamiany wyglądu linków musisz mieć możliwość włączenia (może jest włączony domyślnie) modułu Rewrite na serwerze Apache.

W pliku httpd.conf znaleźć sekcje:
Dynamic Shared Object (DSO) Support
i sprawdzić czy jest: LoadModule rewrite_module modules/mod_rewrite.so
Najczęściej to wystarcza, ale faktycznie bywa różnie. W przypadkach, kiedy występują problemy z uruchomieniem tego modułu warto poszukać rozwiązań na:

Jeśli chodzi o serwery komercyjne bądź darmowe to czy moduł rewrite będzie działał zależy już tylko, od dostawcy usług hostingowych.
Serwery, na których pracowałem:
– testowy: Krasnal serwer 2.7:
– produkcyjny:hosting w home.pl – business server

Zakładając, że nasz moduł chodzi, możemy przejść do kroku następnego, czyli spreparowania pliku .htaccess.

Przygotowanie pliku .htaccess.

Jednym z dwóch filarów systemu zamiany linków jest obok samego przepisania odnośników plik .htaccess. Jego zastosowanie jest bardzo szerokie – pozwala, bowiem na zmianę pewnych ustawień serwera apache tylko dla serwisu, w którym się znajduje (szerzej: http://www.strefaphp.net/artykul55.html)

Na początku pliku umieszczamy kod:

Options FollowSymLinks
RewriteEngine On

teraz „wystarczy” napisać odpowiednie reguły, które tak naprawdę są aliasami do poszczególnych linków naszego serwisu. Po ich stworzeniu nadal możemy się odwoływać do pierwotnych linków.

Przykład:
RewriteRule ^index.html$ index.php [L]
Wyjaśnienie:
RewriteRule – oznacza ze dalej będzie reguła przepisania adresu
^index.html$ – to co chcemy uzyskać
index.php– to co mamy

Podsumowując mając plik: index.php możemy teraz odwołać się do niego również poprzez wpisanie index.html. Jeśli pojawia się jakiś błąd przy odwołaniu przez index.html to może to oznaczać ze na serwerze nie działa moduł rewrite lub nie jest on włączony.

Najprostszy przykład mamy za sobą. Czas na bardziej rzeczywisty problem – zmienne w adresie.
Mamy adresy:

a. Jedna zmienna w adresie
www.strona.pl/index.php?zmienna=25 a chcemy uzyskać: www.strona.pl/index-25.htm
wystarczy reguła:
RewriteRule ^index-([^-]*).htm$ index.php?zmienna=$1
w miejsce ([^-]*) wstawiana jest wartość zmiennej $1

b. Reguły z kilkoma zmiennymi
www.strona.pl/index.php?zmienna1=25&zmienna2=26
a chcemy uzyskać:
www.strona.pl/index-25-26.htm
wystarczy reguła:
RewriteRule ^index-([^-]*)-([^-]*).htm$ index.php?zmienna1=$1&zmienna2=$2 [L]

[L] – oznacza zatrzymanie procesu zamiany linków żadna reguła niżej nie zostanie zastosowana.

Więcej parametrów RewriteRule:

Należy pamiętać o tym by najprostsze reguły były po trudniejszych, innymi słowy najbardziej rozbudowane konstrukcje umieszczamy na początku pliki .htaccess.
Można stosować odpowiednie opcje np. [L] dla reguły, ale na pewno łatwiej zmodyfikujemy plik, jeśli zajdzie taka potrzeba. Na podstawie: http://www.cms.rk.edu.pl/art_42.html.

Sprawdzenie .htaccess

Poprawność pliku .htaccess w zakresie reguł rewrite łatwo zweryfikować, pod warunkiem, że jest ich niewiele.
Wystarczy sprawdzić czy odwołanie:
www.strona.pl/index.php?zmienna1=25&zmienna2=26 i
www.strona.pl/index-25-26.htm
daje ten sam efekt jeśli tak to możemy przejść dalej czyli przepisać linki serwisu.

Przepisanie linków serwisu.

Trudno podać rozwiązanie, które można zastosować w każdej sytuacji.
Na początek warto rozważyć dwie kwestie:
– autor serwisu będzie przepisywał linki
– wykorzystano jakiś gotowy system lub wykonano go na zlecenie.

Jeśli sytuacja pierwsza ma miejsce to autor wie, w jaki sposób generowane są linki i zna strukturę swojego serwisu, więc nie będzie stanowiło problemu dopisanie kilku linijek kodu.

W drugim przypadku trzeba najpierw poznać strukturę serwisu, w jaki sposób są wywoływane poszczególne moduły. Jeśli wszystko sprowadza się do jednego pliku np. index.php to sprawa nie jest trudna, jeśli jest inaczej to informacje które znajdują się poniżej należy zastosować do każdego pliku. Można rozważyć także zlecenie komuś wykonania przystosowania serwisu dla generowania adresów przyjaznych wyszukiwarkom.

Zakładając, że wszystkie wejścia na serwis generowane są przez index.php wystarczy utworzyć plik np. rewrite.php. (plik pochodzi ze strony: http://www.cms.rk.edu.pl/art_136.html )

Nie ma konieczności zagłębiania, dlaczego właśnie taki a nie inny kod.
Wystarczy tylko we właściwym miejscu wprowadzić odpowiednie przepisania linków, i można już cieszyć się przepisywaniem linków.
W skrócie co się dzieje w rewrite.php
1. zmiana linków z nieprzyjaznych na przyjazne przy pomocy wyrażeń regularnych.
2. rozpoczęcie buforowania strony.

3. zakończenie buforowania storny (w każdym pliku gdzie inkludujemy rewrite.php)

Plik rewrite.php należy inkludować we wszystkich plikach serwisu, które są wykorzystywane bez pośrednio – czyli nie sa inkludowane przez inne plik – najwygodniejsza jest sytuacja, gdy jest to jeden plik np. index.php, najlepiej na początku.
A na końcu każdego pliku należy dodać
ob_end_flush();

To by było na tyle.
W razie pytań, wątpliwości zapraszam na forum.
Jeśli będzie zainteresowanie w kolejnym artykule postaram się opisać, co zrobić by maksymalnie przyśpieszyć indeksowanie nowych linków w Google i nie tylko przy wykorzystaniu map stron.

Na forum umieszczone zostały przykładowe kody źródłowe.

Źródła i materiały:
http://www.cms.rk.edu.pl/art_136.html
http://www.cms.rk.edu.pl/art_42.html
http://4programmers.net/Z_pogranicza/Mod_rewrite

O autorze

Radosław Owczarek

Absolwent: 1. UAM Poznań - Informatyk. 2. AE Poznań - Marketing (podyplomowe) Zainteresowania: 1. Bazy danych 2. Techniczne aspekty marketingu...

zobacz więcej artykułów >>

Zostaw komentarz

  1. Redakcja

    Przypominamy, że wielkimi krokami zbliża się konferencja I ♥ Marketing & Technology, która odbędzie się już 16–18 kwietnia 2024 roku oraz organizowane przez nas 33 szkolenia z zakresu marketingu.

    Jeśli chcesz być zawsze na bieżąco, zamów prenumeratę magazynu sprawny.marketing!

    Z kolei jeśli chcesz mieć dostęp do całej wiedzy sprawny.marketing w jednym miejscu, subskrybuj platformę premium.sprawny.marketing.

  2. Krzysztof Gaudy

    Od strony pozycjonowania natomiast, to dla robotów Google lepiej jest robić adres w postaci http://www.strona.pl/index/25/26.htm niż http://www.strona.pl/index-25-26.html. W ten sposób Google nie widzi wszystkich linków jako skatalogowanych w jednym folderze, ale ma całą strukturę (hierarchię) serwisu.

  3. Radosław Owczarek

    Witam.
    Dzięki za komentarze.
    To mój pierwszy artykuł i na pewno daleko mu do ideału.
    Panie Krzysztofie:
    Faktycznie tak jest że lepiej sa indeksowane adresy ze „slash’ami”, ale nie o tym miał być ten artykuł – może nastepny będzie o tym traktował

    Panie Pawle:
    O tym nie wiedziałem – chętnie przeczytam.
    Bardzo wam dziękuje za opinie
    Proszę także o wypowiedzi jak sie mnie czyta.
    Pozdrawiam.

  4. drozdziak

    Jak dla mnie tekst wysoce specjalistyczny ( to a propos pytania „jak sie mnie czyta”)
    W sumie treść nadająca sie dla administratorów strony, mniej dla osób związanych z marketingiem.

  5. Piotrek

    bardzo fajny artykuł. Zaraz zabieram się do pracy i będę przerabiał stronkę.
    Pozdrawiam

  6. Paweł Rabinek

    @Krzysztof Leśniak – milej widzianym adresem będzie „strona/” ponieważ wskazuje na index. Adres „/strona.htm” to konkretny dokument. W gruncie rzeczy nie ma tu znaczącej różnicy. Dobrze jest tworzyć adresy tak, aby były łatwe do zapamiętania/zapisania przez użytkownika oraz aby zawierały frazy kluczowe.

  7. Primero

    Pamiętajmy jednak, że nie od adresu url wszystko zależy. Jest istotny, jednakże 'siła’ zawartości strony może zwiększyć oczekiwaną pozycję wśród wyników wyszukiwania. Każda zmiana i dopasowanie się do obowiązujących algorytmów to właśnie sprawny marketing;)

  8. Usuwanie simlocka

    Ja mam podstrony zapisane jako .html

  9. Darmowe Aliasy

    Ja korzystam bardziej z .htm ;)
    A tak marginesem, bardzo dobry ten artykuł !

  10. (cytat)”….Od strony pozycjonowania natomiast, to dla robotów Google lepiej jest robić adres w postaci http://www.strona.pl/index/25/26.htm niż http://www.strona.pl/index-25-26.html. W ten sposób Google nie widzi wszystkich linków jako skatalogowanych w jednym folderze, ale ma całą strukturę (hierarchię) serwisu…..”

    Przy tej metodzie moze wystąpić jeden problem. Występuje on wtedy,gdy linki w tresci serwisu byly tworzone np. href=’test.php’ a nie href=’/test.php’. Ponieważ znajdujac sie na stronie http://www.strona.pl/index/25/26.htm link przekieruje nas na strone http://www.strona.pl/index/25/test.php, ktory nie istnieje (zakladajac ze istnieje http://www.storna.pl/test.php).

    Moze ktos ma jakis sprytny sposób na to? Ja narazie nie znalazlem rozwiązania

  11. Mirosław Bagrowski

    Witam!
    A jeśli w adresie są ” ??
    Nie działa:
    $link=preg_replace(’#/go/_category/?idc=%22id_3%22#’,’bielizna-damska’,$link);
    jak to obejść? Odpowiedź na bagros [małpa] o2 [kropka] pl

  12. @Maciek

    Ja zastosowałem

    Dzięki temu nie musisz martwić się o linki – u mnie to rozwiązało problem

  13. heh. Chyba autor zlikwidował rozwiązanie przy pomocy strip_tags ;)

    oto ono jeszcze raz:

    <base href=”http://twoja.domena/katalog/” />

    gdyby coś się nie tak wyświetliło to wiadomo, że:
    < -> znak mniejszości
    > -> znak większości

  14. mod rewrite

    Ostatnio pojawił się artykuł na stronie http://sf.jogger.pl , pokazujący najpopularniejsze przykłady zastosowania mod rewrite.

  15. Totolotek

    to działa tylko na małych stronach, każda bardziej rozbudowana strona rozpada sie na kawałki…

  16. Linki podane w artykule nie dzialaja…

  17. Ok juz wiem.Forum…

  18. „Moze ktos ma jakis sprytny sposób na to? Ja narazie nie znalazlem rozwiązania”
    „Niestety metoda olo nie pomogła! Nie ładuje mi się css i js czy wie ktoś jak temu zaradzić?”

    Witam,
    Metoda jest bardzo prosta – zapisz link w pełnej postaci, czyli:
    – href=”http://domena.pl/test.php”
    – href=”http://domena.pl/style.css”
    Tak samo należałoby postępować ze wszystkimi obrazkami:
    zamiast href=”http://domena.pl/flags.gif”

    P.S. Jeśli często zmieniasz domenę to polecam wykorzystać php:
    $DomenaMojejStrony = ‘http://domena.pl/’; (zmienna! ;])

    Pozdrawiam

  19. Bardzo fajny artykuł! Wreszcie udało mi się zrozumieć o co w tym biega… już sobie zamieniłem adresy z brzydkiego „adresstrony.pl/index.php?skok=2” na „adresstrony.pl/kontakt” itp. :)

  20. Fajny artykuł, ale mam pewien problem
    Mianowicie, nie wiem jak zmienić takie coś, aby adres był przyjaźniejszy

    pokaz_sz_ogl.php?idogl=50tytul=Pi%EAkny%20dom%20wolno%20stoj%B1cy,%20du%BFa%20dzia%B3ka
    To idogl=50 jeszcze bym zmienił ,ale ten tytuł nie wiem jak :(

  21. mieszkania szczecin

    Witam, A czy na home.pl wszystkie reguły apache’owe działąją? Bo mam wątpliwości, np. wyświetlanie grafik z podkatalogów.

  22. @cezarylech

    ISAPI Rewrite: Addressing Canonicalization and Redirects on Windows Server
    http://www.searchenginejournal.com/isapi-rewrite-

  23. Zastosowałem reguły dla swojej strony. W przeglądarce wpisując „ręcznie” przyjazny adres, wszystko działa, jeśli natomiast poruszam się między podstronami klikając w linki nadal figurują stare nieprzyjazne adresy… Jak temu zaradzić ?

  24. pcpartners

    A czy przekierowaniem 301 można też skutecznie pozycjonować stronę ?

  25. Antonio

    Vеry nice articⅼe, exɑctly what I wanted
    t᧐ find.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Wpisz imię
Napisz komentarz