Изборник Затворити

Редирекција путања (URL rewriting) на једноставан начин

Скраћена веза: https://pedja.supurovic.net/veza/2286

Пишући чланак о заобилажењу правила за преумеравање путања ка сајту због оптимизације за интернет претраживаче, схватио сам да нисам нигде описао сам поступак примене овакве редирекције на сајту.

Пошто је то техника која је у данашње време неопходна и верујем да би многим новајлијама значило једно такво упутство, ево га.

Зашто је потребна оптимизација путања на сајту (url rewriting)

Један од најважнијих чинилаца добре оптимизације интернет презентације је сама путања до приказаног документа, Google, али и други претраживачи адресу документа узимају као врло јак аргумент приликом одлучивања на којој позицији у резултатима претраге да предложе тај конкретан документ. Због тога је врло важно да путања садржи важне кључне речи.

Адреса документа ипак пре свега служи да покаже где се документ налази и мора да испоштује одређена правила, тако да се до скора СЕО заснивао углавном на томе да се дају прикладна имена самим документима и распоређивање докумената по директоријума на сајту именованим тако да садрже кључне речи. То је и разлог зашто су обично статични сајтови добро рангирани – лако се направи хијерархија докумената тако да путање заиста садрже квалитетне кључне речи.

Код динамичких сајтова, ствари стоје другачије: садржај који ће бити приказан посетиоцу зависи од параметара који су послати скрипт програму. Ти параметри често и не садрже никакве кључне речи него бројеве који означавају документе које треба приказати. Адреса може да изгледа овако:

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

То је врло лоше за рејтинг докумената а има и још једну лошу последицу – корисник не може да из адресе унапред закључи какав документ отвара јер адреса не садржи никакав опис већ код документа.

Преусмеравање путања решава овај проблем: корисник на сајт долази по путањи која му је дата а која је читка и садржи изабране кључне речи. Та адреса иначе не постоји на сајту, али апликација на сајту уме да дату путању препозна и из ње утврди који стварно документ треба да се учита. Тако документ са претходне адресе може да се кориснику представи као:

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

Ова адреса у стварности не постоји, али ће сајт да је прихвати, анализира, и из ње извади податке који су му потребни да прикаже документ. Добитак је у томе што је адреса читка и посетиоцима и претраживачима. Овакав приступ даје заиста велике могућности, на пример, да се употребе кључне речи на језику који је корисник изабрао.

Основе редирекције

Редирекцију на сајту увек ради веб сервер. Њему треба саопштити шта да ради са путањама. Код најраспрострањенијег веб сервера апач за то се користе команде које се стављају у датотеку .htaccess која се налази у основном директоријуму сајта (постоје и други начини али о томе прочитајте у упутству за апач).

Да би редирекција радила, у конфигурацији апача мора бити укључен модул mod_rewrite. Данас је то по правилу укључено на веб серверима али ако је потребно, може се укључити командама

LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c

Ове команде треба ставити у датотеку httpd.conf. У ствари ове две линије су обично већ ту, само су означене како коментар да не би биле извршене.

Редирекцију укључујете тако што у датотеку .htaccess упиште команду

RewriteEngine on

Иза ње треба да следе команде којима се подешава начин редирекције. То може бити и једноставно:

RewriteRule ^/proizvodi$ /proizvodi.php

Ова команда ће „сакрити“ наставак .php, тако да ће документ бити доступан и на адреси http://www.nekisajt.com/proizvodi уместо http://www.nekisajt.com/proizvodi.php.

Ако страна производи има више категорија које се бирају додатним параметром, на пример:

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

Онда можемо поставити правило:

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

На тај начин ће на сајту моћи да се користе путање као на пример:

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

Веб сервер ће ове путање да преусмери као да су у ствари тражене:

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

Ово су само једноставни примери. У упутству за модул mod_rewrite ћете наћи много више команди и примера њихове употребе.

Како се у стварности решава редирекција

Горњи примери илуструју како се користе команде за редирекцију, али се у пракси не уписују ручно команде за сваку страну или комбинацију параметара. За иоле компликован сајт то би одузело много времена, а тешко би било за одржавање, поготово ако се структура сајта промени.

Због тога се тежи поједностављивању – пре свега тако да се постави један скуп правила који ће вршити редирекцију за све садржаје на сајту. То значи да треба унапред осмислити организацију докумената на презентацији и према њима прилагодити параметре и начин редирекције. На пример можете усвојити следећу структуру параметара:

опција, подопција, страна, језик

Без редирекције документу се приступа по путањи (из путање ћу избацити ознаку домена пошто је то обично непроменљиво):

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

Дакле, сајту се увек приступа преко документа index.php (PHP скрипта) коме се прослеђују параметри. Скрипт на основу параметара одлучује који ће садржај и како приказати. Параметри одређују која опција се приказије, која подопција, која страна (ако документ има више страна) и на ком језику. Нећу сада  улазити у то како скрипт index.php учитава и приказује садржај, већ је једино важно да је он тај који на основу параметара контролише приказ.

Када имамо сајт који овако ради, сада можемо лако да подесимо редирекцију која ће преусмерити било који упит тако да скрипта добије параметре онако како их очекује:

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

Дакле, први параметар увек одређује опцију, други подопцију, трећи страну и четврти језик, а index.php ће из СЕО адресе од веб сервера добити параметре како их очекује.

Максимално поједностављење и прилагодљивост

Вероватно сте у претходном примеру видели колико је једноставно припремити правила редирекције, али и да је то тако само ако је сајт једноставан, са прецизном и једноликом структуром у свим садржајима.

Приметићете, ипак, да, ако је сајт сложен, онда он мора имати неке опције које немају подопција, или садржај који приказују стаје на једну страну па је непотребно да се наводи коју страну треба отворити, а да не улазимо у могућност да нека опција може имати више подопција по дубини, и да тај број не мора да буде предвидљив.

На све то, може да се деси да је структура докумената на сајту променљива у тој мери да зависи од онога што уносе корисници (рецимо блог је такав сајт коме се структура унапред не зна).

Ово се решава тако што се посао рашчлањавања значења елемената адресе документа не препушта веб серверу већ самој апликацији. Веб сервер у том случају само треба да изврши једноставну редирекцију на index.php сваке адресе не улазећи у њену структуру.

То ради команда

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

Она веб серверу налаже да ама баш сваку адресу упућену на сајт проследи на документ index.php. Шта ће бити приказано одлучиће тај скрипт, неком својом интерном методологијом. То омогућава да сам скрипт, зависно од случаја до случаја „мења“ правила редирекције. Тако он, ако зна да нека опција нема подопције, неће ни очекивати да се у адреси налази ознака подопције или ако садржај опције стаје на једну страну, неће очекивати да се у адреси налази број стране коју треба приказивати.

Како ће index.php знати која је стварнa адреса којом је корисник приступио сајту? PHP има приступ неким глобалним вредностима које приказује веб сервер. Те вредности су PHP скрипти доступне кроз глобалну променљиву $_SERVER, која је у ствари низ који садржи велики број елемената. Један од елемената је REQUEST_URI, који приказује путању до документа којом је корисник приступио сајт, а то је управо оно што нам треба.

Најједноставнији PHP код који прихвата и приказује путању документа изгледа овако:

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

Даље је само потребно рашчланити путању на саставне делове и из њих прочитати оне вредности које су потребне. То није баш једноставан посао а свакако није тема овог чланка.Уосталом, не морате користити PHP. Узео сам га само као пример, али даљи посао може да уради било који серверски програмски језик.

Редирекција мора бити испраћена приказаним везама на сајту

Прича о редирекцији се не односи само на редирекцију долазних адреса на стварне документе. Процес је кружни, јер да би кориеник дошао на СЕО адресу на вашем сајту, он њу мора негде да види, и кликне на њу, а то значи да сајт мора приказивати све адресе у СЕО облику. Дакле, апликација на сајту, осим што треба да рашчлани долазне адресе мора да уме и да за сваки документ направи одговарајућу СЕО адресу која ће бити приказана.

Тек кад имате овакав заокружен систем, имате услове да заиста примените СЕО на адресе на свом сајту. То ће вам омогућити да имате оптимизоване адресе али и да их заиста употребите. Ево неких битних функција које треба да имате у систему:

– један садржај на сајту сме бити доступан само преко једне адресе. Не сме се догађати да се истом садржају може прићи преко две различите адресе ма колико да је мала разлика. Апликација мора да препозна неисправну адресу и да је замени исправном, тако што ће корисника преусмерити редирекцијом са ознаком HTTP/1.1 301 Moved Permanently.

– адресе на документе у оквиру сајта не треба да уписујете ручно ни у један документ на сајту, већ да их генеришете функцијом којој ћете проследити одговарајуће параметре. Тако ћете обезбедити да генерисана адреса за један документ увек буде иста, а ако уведете неке промене у структури адреса, те ће се промене одмах видети на свим адресама. Дакле, нема ручног уписивања адреса до докумената на сајту, чак ни на насловну страну. Сваки приказани линк мора бити проверен и усклађен са СЕО структуром адреса на сајту.

– ако неки параметар у адреси недостаје, треба да буде замењен подразумеваном вредношћу. Замена не мора да се прикаже у СЕО адреси – можете усвојити правило да параметри који имају подразумеване вредности не треба ни да се појављују у СЕО адреси.

– ако дође до промене адресе документа треба обезбедити механизам који ће стару адресу преусмерити на нову, за случај да постоје спољашњи линкови са других сајтова на ту стару адресу, те да би корсиник ипак добио садржај због кога је дошао.

Уместо детаљнијег објашњавања, упутићу вас да погледате SEO URL TOOLS . То је PHP библиотека коју сам давно направио бавећи се овим проблемом. Она садржи углавном све механизме који вам могу затребати а при том не морате да улазите у детаље око анализе путања, јер она то ради за вас. Ви само треба да опишете структуру путање, а она ће вам вратити вредности које вам требају. Прилично је интелигентна, тако да уме да примени и подразумеване вредности за параметре који недостају, а саме вредности чита на неколико различитих начина тако да вам даје велику слободу у осмишљавању структуре адреса које ћете да користите на свом сајту. Наравно, осим рашчлањавања путања, примењујући иста правила, она ће за вас и генерисати адресе докумената. Уосталом, имате на сајту ове библиотеке демо па можете наживо да пробате како она ради.

Прича још увек није готова

Универзално подешена .htaccess датотека за редирекцију може да изгледа овако:

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]

Овакво подешавање укључује преусмеравање свих путања на index.php с тим да прави изузетак када су у питању независни делови на сајту којима се приступа лозинком (заштита на нивоу сервера, помоћу .htaccess датотеке, не апликације сајта), као и директног приступа постојећим датотекама и директоријумима ван апликације сајта. За детаљније објашњење прочитајте чланак Напредни URL rewriting: заобилажење правила у .htaccess датотеци и password protection независних директоријума . Додатак је и једна, често тражена опција да се, ако корисник приступи сајту на основну адресу без www ознаке, одмах преусмери на пуну адресу која садржи и www.

17 Comments

  1. Zeljko Popivoda

    Хвала на тексту.

    Ево један мали додатак, молба.

    Када се користи поддомен blog.sajt.rs, са овим вашим подешавањима, блог се преусмерава на нпр. http://www.blog.sajt.rs/blog.
    Можете ли направити исправку да би blog.sajt.rs преусмеравао на http://www.blog.sajt.rs.

    Хвала.

    Ево и једног корисног on line алата за тему:
    http://www.scriptalicious.com/tools/www-redirect-generator/

    Поздрав.
    ZPop

  2. Zeljko Popivoda

    Поштовани.

    Нису потребне никакве измене. Само, да би и код поддомена редирекција радила исправно, треба поставити посебан .htaccess фајл за поддомен у његовом фолдеру.

    Хвала и опростите.

    ZPop

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

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

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

    • Peđa

      Мени изгледа као да ради како треба. Погледај на http://seo-url-tools.datavoyage.com/test/ примере.

      Ако је ово исечак из воје стране одна с иоставио негде да приказује садржај објекта.

      Уместо тога, прочитај вредности из објекта у променљиве па корсити да одредиш шта ћеш и како да приказујеш на страни.

  6. dejan

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

    Nerazumem ovo-.,-.,Уместо тога, прочитај вредности из објекта у променљиве па корсити да одредиш шта ћеш и како да приказујеш на страни.

    • Peđa

      Употреба те библиотеке претпоставља напредније познавање ПХП-а. Ако не знаш како да прочиташ вреднсоти из објекта онда ће ти тешко коришћење овог алата.

Оставите одговор на Peđa Одустани од одговора

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *

Попуните израз тако да буде тачан: *

Ово веб место користи Акисмет како би смањило непожељне. Сазнајте како се ваши коментари обрађују.