Administrare server open source

Platforma de hosting cu software liber, gratuit, open source.

Comentariile sunt închise pentru Rescrierea URL-urilor cu mod_rewrite

mod_rewrite este un mod din Apache util in rescrierea URL-urilor real-time. Modulul are un engine bazat pe reguli, compatibile cu expresiile regulate POSIX, care pot fi utilizate in rescrierea URL-urilor.

Pentru utilizare aveti nevoie de doua reguli care pot fi specificate atat in fisierul de configurare Apache (httpd.conf) cat si in fisierul de rescriere a directivelor (.htaccess). Cele doua reguli sunt:

Options +FollowSymLinks
RewriteEngine On

Avem nevoie de +FollowSymLinks pentru ca rescrierea sa functioneze. In majoritatea cazurilor este deja activa aceasta optiune. A doua optiune nu este pornita din httpd.conf decat foarte rar, asa ca trebuie sa o punem in .htaccess. RewriteEngine On ii spune serverului Apache sa incarce modulul mod_rewrite si sa porneasca interpretarea regulilor.

Acum sa vedem la ce ne ajuta mod_rewrite. Ne ajuta in primul rand la rescrierea URL-urilor. Sa luam un caz concret. Aveti un fisier index.php care asteapta ca parametru fisierul care sa il incarce. De obicei trimiteti prin GET fisierul de forma index.php?file=statistici. E destul de urat asa si nu da bine nici pentru utilizator, nici pentru SEO, nici pentru AdSense care se bazeaza si pe titlu cand plaseaza o reclama. In schimb ar arata mult mai bine daca am pune in loc de index.php?file=statistici un link de forma statistici.html. E mai dragut, nu ? Singura problema e ca fisierele html in mod normal nu permit interpretarea scripturilor PHP si chiar daca am face in asa fel incat sa fie interpretate e nasol sa faci 1.000 de fisiere pentru fiecare fisier text care vrei sa il incluzi – presupunand ca asta ar fi situatia. Aici isi intra in rol mod_rewrite.

Pentru a rezolva problema de mai sus e nevoie sa modificam doua fisiere: primul este fisierul in care apar linkurile iar al doilea fisierul .htaccess in care punem regulile de rescriere.

In fisierul in care apar linkurile va trebui modificat codul de generare a linkurilor pentru ca in loc de index.php?file=CEVA sa genereze linkuri de forma CEVA.html. Asta face fiecare cum stie. Daca vrea genereaza, daca nu scrie manual 🙂

In fisierul .htaccess punem cele doua linii mentionate mai sus pentru a putea pune directivele de rescriere si apoi facem o regula care sa rescrie toate cererile de forma CEVA.html in index.php?file=CEVA. Codul ar arata cam asa:

Options +FollowSymLinks
RewriteEngine On
 
RewriteRule ^/([a-z0-9]+)\.html$ index\.php?file=$1 [NC,L]

Asta e tot. Acum orice cerere de forma CEVA.html va afisa rezultatul care in mod normal este afisat de index.php cand i se da ca parametru file=CEVA. Dupa cum se vede regula de rescriere e formata din patru parti: comanda, sablon, script, directiva.

Comanda este aceeasi cand vine vorba de rescrierea URL-urilor si anume RewriteRule (sugestiv, nu?). Trebuie pusa o linie pentru fiecare rescriere de URL care o facem.

Sablonul este partea care ii spune modulului ce anume se include in aceasta regula. Dupa cum vedeti e vorba de o expresie regulata de tip POSIX. Partea care ne intereseaza este inclusa intre paranteze. Daca nu ati mai folosit expresii regulate pana acum, ^ determina inceputul unui sir, $ este sfarsitul unui sir. Partea care ne intereseaza pe noi, ([a-z0-9]+), ar fi explicata in felul urmator: totul se pune intr-o variabila (sirul pe care s-a facut match) iar sablonul corespunde doar daca avem litere de la a la z sau cifre de la 0 la 9 ([a-z0-9]) una sau mai multe (asta spune + de dupa sablon). Deci, daca s-a gasit URL-ul sa corespunda sablonului si pe langa asta sa aiba un .html la sfarsit inseamna ca e ceea ce asteptam.

Scriptul este cel caruia i se va pasa stringul pe care s-a facut match. In cazul nostru este vorba de index.php?file= dupa care urmeaza $1, adica primul match din sablon. Daca in sablon ar fi mai multe campuri din care scoatem variabile (mai multe grupuri de expresii izolate de paranteze) am avea $1 prima variabila, $2 a doua variabila etc.

Directiva de la final ne spune ca sablonul nu va fi case sensitive (NC=No Case) si daca sablonul corespunde aceasta va fi ultima regula (L=Last). In acelasi loc mai putem adauga si alte directive cum ar fi R=301 (Redirect cu un cod de redirectare), QSA (Query String Append) etc. Gasiti o lista in pagina de manual mod_rewrite.

Apache

Comments are closed.