Napisz do nas

Zapraszamy na 23 szkoleń z e-marketingu i konferencję I ♥ Marketing oraz zakupu magazynu

19 Szkoleń i I ♥ Marketing oraz zakupu magazynu

mod_rewrite_logo

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: http://www.olesno.pl/~pablo/krasnal/index.php
– 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: http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#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
http://www.bilsoftware.com/php-mod_rewrite-1.html

sprawnymarketing

Powyższy tekst zawiera prywatne poglądy Autora. Niekoniecznie muszą odzwierciedlać one poglądy Redakcji.

Radosław Owczarek

Absolwent: 1. UAM Poznań - Informatyk. 2. AE Poznań - Marketing (podyplomowe) Zainteresowania: 1. Bazy danych 2. Techniczne aspekty marketingu internetowego 3. Filmy i literatura S-F


  • Redakcja

    Przy okazji przypominamy o nowej grupie na Facebooku, w której odpowiadamy na szereg pytań. Dołącz do Twoja firma w Internecie i Social Media.

    Subskrybuj Sprawny.Marketing na Messengerze, dostaniesz informację o każdym nowym artykule lub materiale video

    Wielkimi krokami zbliża się także dwudniowa konferencja I ♥ Marketing & Social Media oraz organizowane przez nas 24 szkolenia z zakresu marketingu.

    Możesz też zamówić prenumeratę drukowanego magazynu sprawny.marketing


    • Paweł Rabinek

      Mod_rewrite daje także (między innymi) możliwość towrzenia subdomen i przypisywania ich do katalogów na serwerach. Jest to szczególnie przydatne gdy brakuje takiej opcji w panelu administracji naszego hostingu. Na moim blogu: http://blog.xradar.net/seo/subdomeny-htaccess-apache/ opisałem jak stworzyć odpowiednie wpisy w .htaccess aby uzyskać taki efekt.

    • 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.

    • 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.

    • Piotrek

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

    • 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.

    • 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;)

    • Darmowe Aliasy

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

    • (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

    • 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

    • @Maciek

      Ja zastosowałem

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

    • 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

    • mod rewrite

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

    • Niestety metoda olo nie pomogła! Nie ładuje mi się css i js czy wie ktoś jak temu zaradzić?

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

    • jacek mazury

      a u mnie na serwerze mam niby włączone mod rewrite – tak twierdzi admin a nie mogę tam wgrać pliku .htaccess .. nie ma błędu przy wgrywaniu , mam ustawione w commanderze pliki ukryte a po skopiowaniu .htaccess plik jakby znikał …

    • „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

    • Wiktor

      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. :)

    • bybek5

      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 :(

    • free vectors

      Troszkę chaotycznie pisany kilka rzeczy nieprzydatnych ale ogólna ocena dobra pozdrawiam serdecznie

    • 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.

    • Paweł

      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ć ?

    • pcpartners

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

    Dodaj komentarz

    Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *