asterisk
Rugpjūtis 21, 2006

Svetainių adresai (URLs)

Naršydami internete, lankydamiesi įvariose svetainėse pastebėjote daugybę įvairių adresų tipų. Dažniausiai galima sutikti tokius adresus:
/index.php?module=news&id=15151&page=1
/archyvas.php?cat=4&date=2006-01-01

Serverio pusėje skriptai sugeneruoja turinį, pagal pateiktus duomenis adrese. Šiuo atveju PHP, naudojantis GET metodu. Taip pat galima sutikti ir tokių adresų:
/index.php/news/15151/1
/archyvas.php/4/2006-01-01

Aukščiau pateikti adresai nėra labai patogūs ir optimalūs. Norint labiau optimizuoti svetainę paieškos sistemoms, padaryti jog adresai būtų geriau įsimenami, siūlau naudoti tokius adresus:

/news/straipsnio-pavadinimas/
/news/2006/01/01/straipsnio-pavadinimas/
/archyvas/2006/01/01/kategorijos-pavadinimas/
/archyvas/2006/01/01/kategorijos-id/

tokių variantų galima sugalvoti nemažai, viskas priklauso nuo jūsų sistemos.
Tarkim pixel.lt naudojame tokį variantą:
/straipsnio-pavadinimas.html // http://www.pixel.lt/straipsnio-pavadinimas.html
Tokį adresą daug lengviau įsiminti, paieškos sistemos geresnėse pozicijose jūsų svetainę rodys ir pan.

Taip pat tokie adresai atrodo estetiškiau ir gražiau.

Perrašom adresus su Apache

Apache web serveris dažniausiai naudojamas su Unix sistemomis, tačiau veikia ir su NT (apie apache pasiskaitykit čia). Jis turi komponentą/modulį mod_rewrite, kurio pagalba mes pabandysim susitvarkyti savo adresus (URLs). Norėdami sužinoti ar šis dalykas yra įdiegtas jūsų virtualiam serveryje (jei naudojate kokį nors shared hostingą), paklauskite administratoriaus, arba pabandykite ką nors rewritinti.

Mod_rewrite modulis tikrina kiekvieną užklaustą adresą, jei jis atitinka mūsų parašytai perrašymo funkcijai, jis atlieka savo darbą ir perduoda duomenis ten kur prašome.

Jei jūs dirbate ne su Apache arba dar nesate jo ‘įvaldęs’ jums teks pasiskaityti truputį informacijos apie adresų perrašinėjimą (url rewriting). Geriausia paleisti mod_rewrite yra iš serverio httpd.conf bylos, tačiau jį iškviesti galite ir per .htaccess. Jei neturite teisių valdyti serverio konfigūracijos failų, jums teks pasirinkti .htaccess būdą, bet nepamirškite, jog greičio atžvilgiu httpd.conf yra geriau, kadangi kiekvieną kartą siunčiant adresą Apache turės perskaityti jūsų .htacess.

Užduotis

Mūsų užduotis sukurti mod_rewrite taisykles, kurios mums padės susitvarkyti savo adresus. Visų pirma mums reikia padaryti, jog įvedus šį adresą:
http://jusu.pavyzdys.lt/news/straipsnio-pavadinimas/

gautume duomenis į mūsų skriptą:
/index.php?module=news&pav=straipsnio-pavadinimas

Planas

Mūsų URI yra news/straipsnio-pavadinimas/ ir duomenis norim perduoti į /index.php?module=news&pav=straipsnio-pavadinimas. Taigi turime padaryti šiuos veiksmus:
Atpažinti URL:
/news/straipsnio-pavadinimas/ turime išskirti modulį: news ir straipsnio pavadinimą: straipsnio-pavadinimas.
Viską perduoti kitam adresui, index.php, per GET metodą - /index.php?module=news&pav=straipsnio-pavadinimas.

Regex ir RewriteRule

Mūsų darbui atlikti prireiks dviejų komandų iš mod_rewrite: RewriteEngine ir RewriteRule. This transform will require two of the directives from mod_rewrite: RewriteEngine and RewriteRule. Su RewriteEngine nurodome ar perrašymas veiks ar ne (on/off). Jis skirtas administratoriams sutaupyti laiko, kad būtų galima greitai įjungti/išjungti URL perrašymą. RewriteRule naudoja regex (reguliarių išraiškų) parserį, kuris palygina URL ar URI su mūsų nurodyta taisykle.

Taigi bandom rašyti rewriterule taisyklę .htaccess faile (jį reikia talpinti į pagrindinę svetainės direktoriją, kur bus naudojami adresai):

RewriteEngine On
RewriteRule ^news/(.*) index.php?module=news&pav=$1

Ši taisyklė pirmiausiai pažiūrėjo ar adrese yra news, ir ar po news yra dar kažkokie simboliai ir visa tai perrašė į tai ko mums reikia. (.*) nurodo jog mums tiks bet kokie simboliai. $1 perduoda atitikimo reikšmę. Jei jų būtų daugiau analogiškai atsirastų $2, $3…

Kas jeigu mano serveris ne Apache ?

Deja IIS neturi rewrite mechanizmo. Tačiau jūs galite pasirašyti ISAPI filtrą.

Šiek tiek dokumentacijos

Geri URLs - dalis interfeiso dizaino. Jakob Nielsen: http://www.useit.com/alertbox/990321.html.

Šį straipsnį įkvėpė parašyti Tim Berners-Lee’s nuomonė jog geri adresai nesikeičia: http://w3.org/Provider/Style/URI

Rafe Engelschall turi daugybę mod_rewrite pavyzdžių ‘cookbook’ formoje šiame tinklalapyje: http://www.engelschall.com/pw/apache/rewriteguide/.

Lietuviškas straipsniukas apie .htaccess ir .htapasswd: http://www.spraitas.ku.lt/?p=2

Panašūs straipsniai


“Svetainių adresai (URLs)” komentarų: 15

  1. enc

    PHP neturi tokio metodo kaip GET…

  2. jungle

    tu atsigauk ir biski paskaityk ka tu parasei :)

    pats apache neturi rewrite mechanizmo, o turi moduli - mod_rewrite, bet tai lygiai ta pati turi ir iis - isapi_rewrite

    ir isvis siandien rasyti isapi filtrus gali pasiulyti tik koks nors kaimo ku-ku dundulis ;)

  3. asterisk

    aš ir esu iš kaimo :(

  4. asterisk

    Jungle irc apšvietė jog ISAPI filtrai gan pasenus technologija ir patarė naudoti HttpModule, HttpHandler.

  5. ZaZa

    Pradejas skaityti, manaiu kad bus kaž-kas naujo…

  6. mid

    vis dar tikiesi? :)

  7. asterisk

    rašydamas, tikėjausi kad pavyks kažką naujo parašyti, deja pavyko tik apibendrinti informaciją pateikta kitur :)

  8. rytis

    tai galite duoti normalių, veikiančių pavyzdžių, kaip pasidaryti šį stebuklą?

  9. asterisk

    Straipsnį pateikti normalūs veikiantys pavyzdžiai, kaip padaryti šį stebuklą :)

  10. ZaZa

    Svetainiu geru URLu gamyba yra kiekvieno asmeninis reikalas, kuris priklauso nuo žinių ir turimu galimybiu.

    Man asmenishkai patinka toks variantas:

    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [QSA,L]

    Kartais:

    RewriteEngine On
    RewriteBase /blog/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php/$1 [L,QSA]

    O toliau jau PHP ir savo fantazija

  11. sniegas

    Ačiū! Nuostabiai pagelbėjai!

  12. FDisk

    Man tai patiko toks:
    RewriteEngine On
    RewriteCond %{QUERY_STRING} ^(.*)$

    Ka nori ir kiek nori vedi i adresa /
    pvz: http://tavo_svetaine.com/index.php/jo/jo/nejo/o_ane/kas/yra
    Niu ir duomenu isvemimui pasirasom funkcija:

    Kad neliktu to .php dar galit RewriteRule pasirasyti

  13. Sladex

    Radau naudingos info

  14. Sadas123

    Aciu, man izanga patiko :)

  15. traders

    Kaip del rusisku URL niekur neradau tutorialo kaip rusiskas raides atvaizduot

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.