Jump to content
Dr4k3

[php]Cele mai frumoase URL-uri

Recommended Posts

Posted

Cea mai frumoasa si mai gustoasa supa nu are nici o legatura cu farfuria in care este pusa. Ati incercat totusi sa mancati cea mai frumoasa si mai gustoasa supa dintr-o farfurie perfect plata? Stiti, sunt farfuriile acelea patrate si mari, mari de tot, care fac o supa la fel de buna ca mult prea mult bors.

Un site este asemanator unei astfel de supe in multe privinte. Toate ingredientele pot fi perfect echilibrate, iar siteul poate lasa un gust perfect in mintea vizitatorului, insa totul depinde de modul in care siteul ajunge la vizitator. URL-uri frumoase si usor de tinut minte sunt la fel de importante ca restul siteului.

Si Google mananca supa din farfurie adanca

Oricat de ciudat suna, asa este. Motoarele de cautare precum Google nu indexeaza decat anumite URL-uri, in speta, le sare pe acelea care contin caractere ciudate precum ? sau &, sau alte extensii decat .html (de exemplu, .php). Si atunci siteul nostru nu mai este indexabil. Problema trebuie rezolvata cat mai repede.

Cum va place urmatorul URL:

http://www.example.com/index.php?pid=categories&action=edit&eid=14

Am putea sa-l schimbam foarte usor, pentru a arata in felul urmator:

http://www.example.com/categories/edit/14/

Mult mai bine acum, nu? Plus ca este usor de retinut si indexabil.

Apache si .htaccess

Pentru a realiza acest mic feat trebuie sa-i spunem serverului sa ne transforme URL-ul primit la o cerere HTTP intr-unul de o forma mai atragatoare. Apache permite rescrierea URL-urilor printr-un modul minunat numit mod_rewrite. Pentru a specifica niste reguli de rescriere pe care acest modul sa le foloseasca, vom utiliza fisierul .htaccess.

In radacina siteului vostru creati un fisier fara nume, doar cu extensia .htaccess. Acest fisier este de tip text si in el vom scrie ce ne trebuie. Este bine sa setam in scripturile noastre parametrii impliciti si sa prevedem URL-uri de forma:

http://www.example.com/categories/

http://www.example.com/categories/edit/

De aceea vom incepe rescrierea progresiv, cu primul parametru, apoi cu al doilea si asa mai departe. Pentru a fi siguri de rezultat, vom incepe fisierul nostru .htaccess cu o conditie:

<IfModule mod_rewrite.c>

RewriteEngine on

</IfModule>

Conditia testeaza existenta modulului mod_rewrite. In cazul in care el exista, il va porni. Desi el este setat pe ON in majoritatea pachetelor de hosting, niciodata nu strica sa verifici. Sa purcedem acum la rescriere.

Fiecare pagina a siteului va avea un numar de parametri $_GET, pornind de la 0 la un numar maxim pe care va trebui sa-l stabiliti voi. Majoritatea programatorilor prefera modelul de tip MVC, in care primul parametru este pagina, al doilea actiunea, iar ceilalti doi variaza. In exemplul nostru nu am avut nevoie decat de id-ul elementului ce trebuia editat. Presupunem deci ca avem un GET de forma:

$_GET = Array(

page,

action,

param1,

param2

)

Haideti sa rescriem primul parametru, "page". Vom utiliza comanda rewriteRule pentru a stabili regula.

RewriteRule <regex::rezultat> <string::URL>

Prima parte a comenzii, <regex::rezultat> reprezinta rezultatul la care vrem sa ajungem, iar a doua, <string::URL>#end_code este URLul initial cu ? si & cu care suntem obisnuiti. Apache va modifica toate URLurile de forma <regex::rezultat> in URLuri de forma <string::URL>#end_code. Astfel, daca vom scrie in browser <regex::rezultat>, serverul va trimite inapoi <string::URL>. Nimic mai simplu. Dar sa lamurim printr-un exemplu.

Practica nu ne omoara

RewriteRule ^([a-zA-Z]+)[/]*$ ?page=$1

Am utilizat regular expressions. Daca nu va sunt familiare, va spun doar ca ceea ce pare complicat de fapt nu este. Puteti citi tutorialul precedent pentru a va lamuri ce inseamna tot ce am scris acolo. Promit ca o sa fie de folos.

Prin urmare, ce am facut este sa-i spun Apacheului ca atunci cand intalneste un URL de forma "/" sa serveasca browserului pagina aflata la URLul ?page=, adica pagina normala server-side pe care o foloseati pana acum. $1 din sirul ?page=$1 inseamna prima paranteza din regexul precedent, adica ^([a-zA-Z]+)[/]*$.

Sa trecem mai departe la al doilea parametru: action.

RewriteRule ^([a-zA-Z]+)[/]([a-zA-Z]+)[/]*$ ?model=$1&action=$2

Nu am facut decat sa repetam prima paranteza, iar in URLul initial sa scriem &action=$2, intocmai cum am fi scris inainte, cand foloseam URLuri cu $_GET. Pentru al treilea si al patrulea parametru vom proceda intocmai.

Si acum cum ne mai folosim de $_GET?

E o intrebare fireasca. Daca URLul nostru arata acum astfel: http://www.example.com/categories/edit/14/ atunci unde gasim cheile si valorile din $_GET. Nu uitati ca am stabilit niste chei standard, pe care le-am folosit in RewriteRule: page, action, param1 si param2. Acestea sunt cheile arrayului $_GET, iar valorile sale sunt caracterele dintre slash-uri. Astfel, cunoscand aceste chei si privind URLul nostru, putem deduce usor GET-ul:

$_GET = array (

'page' => 'categories',

'action' => 'edit',

'param1' => '14'

)

In spatele acestui URL, serverul utilizeaza de fapt un alt URL, si anume cel pe care il utilizam noi inainte de a invata rewrite:

http://www.example.com/index.php?pid=categories&action=edit&eid=14

Practic, URLul rescris, http://www.example.com/categories/edit/14/, nu este decat "de ochii lumii", serverul lucrand in continuare la fel. Astfel, veti putea utiliza GET-ul ca si pana acum.

Puteti modifica aceste chei pentru a va servi propriului site. Nu uitati sa modificati si in .htaccess.

Intreaga smecherie este insa de a utiliza aceiasi parametri, aceleasi chei ale arrayului GET. Daca siteul tau are doua pagini, si fiecare pagina are parametrii ei, vei avea mai multe reguli de scris - cate una pentru fiecare parametru - plus ca va trebui sa verifici in regex ce fel de parametru ai. Daca parametrii GET nu sunt comuni intregului site, URLul ar trebui sa se transforme in:

http://www.example.com/page/categories/action/edit/

iar regula in:

RewriteRule ^([a-zA-Z]+)[/]([a-zA-Z])+[/]([a-zA-Z]+)[/]([a-zA-Z]+[/])$ ?$1=$2&$3=$4

Acest lucru este necesar pentru pastrarea numelor parametrilor, in cazul in care acestia sunt diferiti de la pagina la pagina. Daca insa alegeti acelasi nume pentru toti parametrii din site, va va fi mult mai usor sa lucrati si nu va mai fi nevoie sa transmiteti numele parametrilor in URL. Daca totusi ati utilizat parametrii diferiti, o solutie este sa le schimbati numele in "param1", "param2" etc. Daca faceti asa, va trebui sa modificati scriptul si sa fiti atenti la ordinea parametrilor in URL.

Exemplu: pagina 1 = ?cat=1&id=213 pagina 2 = ?firma=32&user=no

Parametrii vor trebui sa se transforme astfel: Pagina 1 : cat in param1, id in param2 Pagina 2 : firma in param1, user in param2

Sper ca am fost destul de clar in explicarea unei probleme destul de spinoase. Parte din puterea mod_rewrite consta in utilizarea optima a regular expressions, asa ca aruncati un ochi si peste tutorialul care le trateaza, pentru a putea aplica cu mai mult succes tehnica rescrierii.

Autor Vlad Fratila

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...