Izbornik Zatvoriti

Redirekcija putanja (URL rewriting) na jednostavan način

Skraćena veza: https://pedja.supurovic.net/veza/2286

Pišući članak o zaobilaženju pravila za preumeravanje putanja ka sajtu zbog optimizacije za internet pretraživače, shvatio sam da nisam nigde opisao sam postupak primene ovakve redirekcije na sajtu.

Pošto je to tehnika koja je u današnje vreme neophodna i verujem da bi mnogim novajlijama značilo jedno takvo uputstvo, evo ga.

Zašto je potrebna optimizacija putanja na sajtu (url rewriting)

Jedan od najvažnijih činilaca dobre optimizacije internet prezentacije je sama putanja do prikazanog dokumenta, Google, ali i drugi pretraživači adresu dokumenta uzimaju kao vrlo jak argument prilikom odlučivanja na kojoj poziciji u rezultatima pretrage da predlože taj konkretan dokument. Zbog toga je vrlo važno da putanja sadrži važne ključne reči.

Adresa dokumenta ipak pre svega služi da pokaže gde se dokument nalazi i mora da ispoštuje određena pravila, tako da se do skora SEO zasnivao uglavnom na tome da se daju prikladna imena samim dokumentima i raspoređivanje dokumenata po direktorijuma na sajtu imenovanim tako da sadrže ključne reči. To je i razlog zašto su obično statični sajtovi dobro rangirani – lako se napravi hijerarhija dokumenata tako da putanje zaista sadrže kvalitetne ključne reči.

Kod dinamičkih sajtova, stvari stoje drugačije: sadržaj koji će biti prikazan posetiocu zavisi od parametara koji su poslati skript programu. Ti parametri često i ne sadrže nikakve ključne reči nego brojeve koji označavaju dokumente koje treba prikazati. Adresa može da izgleda ovako:

http://www.nekisajt.com/proizvodi.php?kat=12&sort=1&redosled=rastuci

To je vrlo loše za rejting dokumenata a ima i još jednu lošu posledicu – korisnik ne može da iz adrese unapred zaključi kakav dokument otvara jer adresa ne sadrži nikakav opis već kod dokumenta.

Preusmeravanje putanja rešava ovaj problem: korisnik na sajt dolazi po putanji koja mu je data a koja je čitka i sadrži izabrane ključne reči. Ta adresa inače ne postoji na sajtu, ali aplikacija na sajtu ume da datu putanju prepozna i iz nje utvrdi koji stvarno dokument treba da se učita. Tako dokument sa prethodne adrese može da se korisniku predstavi kao:

http://www.nekisajt.com/proizvodi.cipele.cena.rastuci

Ova adresa u stvarnosti ne postoji, ali će sajt da je prihvati, analizira, i iz nje izvadi podatke koji su mu potrebni da prikaže dokument. Dobitak je u tome što je adresa čitka i posetiocima i pretraživačima. Ovakav pristup daje zaista velike mogućnosti, na primer, da se upotrebe ključne reči na jeziku koji je korisnik izabrao.

Osnove redirekcije

Redirekciju na sajtu uvek radi veb server. Njemu treba saopštiti šta da radi sa putanjama. Kod najrasprostranjenijeg veb servera apač za to se koriste komande koje se stavljaju u datoteku .htaccess koja se nalazi u osnovnom direktorijumu sajta (postoje i drugi načini ali o tome pročitajte u uputstvu za apač).

Da bi redirekcija radila, u konfiguraciji apača mora biti uključen modul mod_rewrite. Danas je to po pravilu uključeno na veb serverima ali ako je potrebno, može se uključiti komandama

LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c

Ove komande treba staviti u datoteku httpd.conf. U stvari ove dve linije su obično već tu, samo su označene kako komentar da ne bi bile izvršene.

Redirekciju uključujete tako što u datoteku .htaccess upište komandu

RewriteEngine on

Iza nje treba da slede komande kojima se podešava način redirekcije. To može biti i jednostavno:

RewriteRule ^/proizvodi$ /proizvodi.php

Ova komanda će „sakriti“ nastavak .php, tako da će dokument biti dostupan i na adresi http://www.nekisajt.com/proizvodi umesto http://www.nekisajt.com/proizvodi.php.

Ako strana proizvodi ima više kategorija koje se biraju dodatnim parametrom, na primer:

http://www.nekisajt.com/proizvodi.php?kat=cipele

Onda možemo postaviti pravilo:

RewriteRule ^/proizvodi/(.+)$ /proizvodi.php?kat=$1

Na taj način će na sajtu moći da se koriste putanje kao na primer:

http://www.nekisajt.com/proizvodi/cipele
http://www.nekisajt.com/proizvodi/majice
http://www.nekisajt.com/proizvodi/kape

Veb server će ove putanje da preusmeri kao da su u stvari tražene:

http://www.nekisajt.com/proizvodi.php?kat=cipele
http://www.nekisajt.com/proizvodi.php?kat=majice
http://www.nekisajt.com/proizvodi.php?kat=kape

Ovo su samo jednostavni primeri. U uputstvu za modul mod_rewrite ćete naći mnogo više komandi i primera njihove upotrebe.

Kako se u stvarnosti rešava redirekcija

Gornji primeri ilustruju kako se koriste komande za redirekciju, ali se u praksi ne upisuju ručno komande za svaku stranu ili kombinaciju parametara. Za iole komplikovan sajt to bi oduzelo mnogo vremena, a teško bi bilo za održavanje, pogotovo ako se struktura sajta promeni.

Zbog toga se teži pojednostavljivanju – pre svega tako da se postavi jedan skup pravila koji će vršiti redirekciju za sve sadržaje na sajtu. To znači da treba unapred osmisliti organizaciju dokumenata na prezentaciji i prema njima prilagoditi parametre i način redirekcije. Na primer možete usvojiti sledeću strukturu parametara:

opcija, podopcija, strana, jezik

Bez redirekcije dokumentu se pristupa po putanji (iz putanje ću izbaciti oznaku domena pošto je to obično nepromenljivo):

index.php?opt=proizvodi&kat=cipele&strana=2&jezik=sr

Dakle, sajtu se uvek pristupa preko dokumenta index.php (PHP skripta) kome se prosleđuju parametri. Skript na osnovu parametara odlučuje koji će sadržaj i kako prikazati. Parametri određuju koja opcija se prikazije, koja podopcija, koja strana (ako dokument ima više strana) i na kom jeziku. Neću sada  ulaziti u to kako skript index.php učitava i prikazuje sadržaj, već je jedino važno da je on taj koji na osnovu parametara kontroliše prikaz.

Kada imamo sajt koji ovako radi, sada možemo lako da podesimo redirekciju koja će preusmeriti bilo koji upit tako da skripta dobije parametre onako kako ih očekuje:

RewriteRule ^/(.+)/(.+)/(.+)/(.+)$ /index.php?opt=$1&kat=$2&strana=$3&jezik=$4

Dakle, prvi parametar uvek određuje opciju, drugi podopciju, treći stranu i četvrti jezik, a index.php će iz SEO adrese od veb servera dobiti parametre kako ih očekuje.

Maksimalno pojednostavljenje i prilagodljivost

Verovatno ste u prethodnom primeru videli koliko je jednostavno pripremiti pravila redirekcije, ali i da je to tako samo ako je sajt jednostavan, sa preciznom i jednolikom strukturom u svim sadržajima.

Primetićete, ipak, da, ako je sajt složen, onda on mora imati neke opcije koje nemaju podopcija, ili sadržaj koji prikazuju staje na jednu stranu pa je nepotrebno da se navodi koju stranu treba otvoriti, a da ne ulazimo u mogućnost da neka opcija može imati više podopcija po dubini, i da taj broj ne mora da bude predvidljiv.

Na sve to, može da se desi da je struktura dokumenata na sajtu promenljiva u toj meri da zavisi od onoga što unose korisnici (recimo blog je takav sajt kome se struktura unapred ne zna).

Ovo se rešava tako što se posao raščlanjavanja značenja elemenata adrese dokumenta ne prepušta veb serveru već samoj aplikaciji. Veb server u tom slučaju samo treba da izvrši jednostavnu redirekciju na index.php svake adrese ne ulazeći u njenu strukturu.

To radi komanda

RewriteRule ^(.*)$ index.php [L,QSA]

Ona veb serveru nalaže da ama baš svaku adresu upućenu na sajt prosledi na dokument index.php. Šta će biti prikazano odlučiće taj skript, nekom svojom internom metodologijom. To omogućava da sam skript, zavisno od slučaja do slučaja „menja“ pravila redirekcije. Tako on, ako zna da neka opcija nema podopcije, neće ni očekivati da se u adresi nalazi oznaka podopcije ili ako sadržaj opcije staje na jednu stranu, neće očekivati da se u adresi nalazi broj strane koju treba prikazivati.

Kako će index.php znati koja je stvarna adresa kojom je korisnik pristupio sajtu? PHP ima pristup nekim globalnim vrednostima koje prikazuje veb server. Te vrednosti su PHP skripti dostupne kroz globalnu promenljivu $_SERVER, koja je u stvari niz koji sadrži veliki broj elemenata. Jedan od elemenata je REQUEST_URI, koji prikazuje putanju do dokumenta kojom je korisnik pristupio sajt, a to je upravo ono što nam treba.

Najjednostavniji PHP kod koji prihvata i prikazuje putanju dokumenta izgleda ovako:

<?php
   $m_uri = $_SERVER;
   echo $m_uri;
?>

Dalje je samo potrebno raščlaniti putanju na sastavne delove i iz njih pročitati one vrednosti koje su potrebne. To nije baš jednostavan posao a svakako nije tema ovog članka.Uostalom, ne morate koristiti PHP. Uzeo sam ga samo kao primer, ali dalji posao može da uradi bilo koji serverski programski jezik.

Redirekcija mora biti ispraćena prikazanim vezama na sajtu

Priča o redirekciji se ne odnosi samo na redirekciju dolaznih adresa na stvarne dokumente. Proces je kružni, jer da bi korienik došao na SEO adresu na vašem sajtu, on nju mora negde da vidi, i klikne na nju, a to znači da sajt mora prikazivati sve adrese u SEO obliku. Dakle, aplikacija na sajtu, osim što treba da raščlani dolazne adrese mora da ume i da za svaki dokument napravi odgovarajuću SEO adresu koja će biti prikazana.

Tek kad imate ovakav zaokružen sistem, imate uslove da zaista primenite SEO na adrese na svom sajtu. To će vam omogućiti da imate optimizovane adrese ali i da ih zaista upotrebite. Evo nekih bitnih funkcija koje treba da imate u sistemu:

– jedan sadržaj na sajtu sme biti dostupan samo preko jedne adrese. Ne sme se događati da se istom sadržaju može prići preko dve različite adrese ma koliko da je mala razlika. Aplikacija mora da prepozna neispravnu adresu i da je zameni ispravnom, tako što će korisnika preusmeriti redirekcijom sa oznakom HTTP/1.1 301 Moved Permanently.

– adrese na dokumente u okviru sajta ne treba da upisujete ručno ni u jedan dokument na sajtu, već da ih generišete funkcijom kojoj ćete proslediti odgovarajuće parametre. Tako ćete obezbediti da generisana adresa za jedan dokument uvek bude ista, a ako uvedete neke promene u strukturi adresa, te će se promene odmah videti na svim adresama. Dakle, nema ručnog upisivanja adresa do dokumenata na sajtu, čak ni na naslovnu stranu. Svaki prikazani link mora biti proveren i usklađen sa SEO strukturom adresa na sajtu.

– ako neki parametar u adresi nedostaje, treba da bude zamenjen podrazumevanom vrednošću. Zamena ne mora da se prikaže u SEO adresi – možete usvojiti pravilo da parametri koji imaju podrazumevane vrednosti ne treba ni da se pojavljuju u SEO adresi.

– ako dođe do promene adrese dokumenta treba obezbediti mehanizam koji će staru adresu preusmeriti na novu, za slučaj da postoje spoljašnji linkovi sa drugih sajtova na tu staru adresu, te da bi korsinik ipak dobio sadržaj zbog koga je došao.

Umesto detaljnijeg objašnjavanja, uputiću vas da pogledate SEO URL TOOLS . To je PHP biblioteka koju sam davno napravio baveći se ovim problemom. Ona sadrži uglavnom sve mehanizme koji vam mogu zatrebati a pri tom ne morate da ulazite u detalje oko analize putanja, jer ona to radi za vas. Vi samo treba da opišete strukturu putanje, a ona će vam vratiti vrednosti koje vam trebaju. Prilično je inteligentna, tako da ume da primeni i podrazumevane vrednosti za parametre koji nedostaju, a same vrednosti čita na nekoliko različitih načina tako da vam daje veliku slobodu u osmišljavanju strukture adresa koje ćete da koristite na svom sajtu. Naravno, osim raščlanjavanja putanja, primenjujući ista pravila, ona će za vas i generisati adrese dokumenata. Uostalom, imate na sajtu ove biblioteke demo pa možete naživo da probate kako ona radi.

Priča još uvek nije gotova

Univerzalno podešena .htaccess datoteka za redirekciju može da izgleda ovako:

RewriteEngine on
ErrorDocument 401 default

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php [L,QSA]
RewriteCond %{HTTP_HOST} !^(www)(.*)$

RewriteRule ^/?(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Ovakvo podešavanje uključuje preusmeravanje svih putanja na index.php s tim da pravi izuzetak kada su u pitanju nezavisni delovi na sajtu kojima se pristupa lozinkom (zaštita na nivou servera, pomoću .htaccess datoteke, ne aplikacije sajta), kao i direktnog pristupa postojećim datotekama i direktorijumima van aplikacije sajta. Za detaljnije objašnjenje pročitajte članak Napredni URL rewriting: zaobilaženje pravila u .htaccess datoteci i password protection nezavisnih direktorijuma . Dodatak je i jedna, često tražena opcija da se, ako korisnik pristupi sajtu na osnovnu adresu bez www oznake, odmah preusmeri na punu adresu koja sadrži i www.

17 Comments

  1. Zeljko Popivoda

    Poštovani.

    Nisu potrebne nikakve izmene. Samo, da bi i kod poddomena redirekcija radila ispravno, treba postaviti poseban .htaccess fajl za poddomen u njegovom folderu.

    Hvala i oprostite.

    ZPop

  2. marko

    Nije mi jasno kada ubacim ovu php skriptu koja je na ovom sajtu

    Kako link izgleda kada se navodi u samoj php ili html strani prema fajlu.
    I kako mogu da napravim ovu putanju (link)primer:

    <a href=“/tutorials/tutorial1/“ rel=“nofollow“>tutorial1</a>
    prema fajlu.

  3. marko

    Kako da bez url-rewrite napravim ovakvu putanju ka fajlu,link u
    samoj stranici href=“/tutorials/tutorial1/“,a fajl je -(tutoril1.php na primer).

  4. dejan

    Kod mene neradi seo url, index.php skriptu sam kopirao u glavni index.php fajl.
    .htaccess napravio i stavio u root dir. , a i ukljucijo sam php fajl class_seo_url.php.
    Inace ovo sam probao na localhostu.

  5. dejan

    Nerazumem te šta si napisao u svom predhodnom postu.
    Isečak je iz moje strane sve sam proverio i neradi.

    Nerazumem ovo-.,-.,Umesto toga, pročitaj vrednosti iz objekta u promenljive pa korsiti da odrediš šta ćeš i kako da prikazuješ na strani.

    • Peđa

      Upotreba te biblioteke pretpostavlja naprednije poznavanje PHP-a. Ako ne znaš kako da pročitaš vrednsoti iz objekta onda će ti teško korišćenje ovog alata.

Ostavite odgovor

Vaša adresa e-pošte neće biti objavljena. Neophodna polja su označena *

Popunite izraz tako da bude tačan: *

Ovo veb mesto koristi Akismet kako bi smanjilo nepoželjne. Saznajte kako se vaši komentari obrađuju.