Ghid Mod Rewrite

postat acum 4 ani de Stefanescu Mihai in categorie iNoob

Nota: In acest ghid se presupune din start ca:
-Aveti Apache 1.3 sau mai nou
-Aveti PHP
-Modul Rewrite activat

Important: Asigurati-va ca modul rewrite este instalat si activat, pentru ca pe unele web-hosturi acesta nu este activat.

Pentru a verifica daca acesta este instalat puteti proceda astfel:
-intr-un fisier PHP numit phpinfo.php copiati urmatorul cod:

<?php

phpinfo();

?>

Pe majoritatea serverelor puteti verifica daca modul rewrite este instalat cu metoda de mai sus, dar in caz ca folositi CGI sau SuPHP veti fi nevoiti sa verificati in fisierul httpd.conf manual.

Acum, cauta pe aceasta pagina in sectiunea Loaded Modules. Pentru a ajunge acolo mai usor folositi combinatia de taste Ctrl+F in browser. In lista gasita cautati mod_rewrite, daca este acolo totul este pregatit, daca nu il gasiti in lista trebuie sa il activati.

Pentru a-l activa trebuie sa gasiti fisierul de configurare Apache numit httpd.conf

Nota: Daca lucrati pe un server shared si nu aveti acces la fisierul httpd.conf veti fi nevoiti sa contactati firma de hosting si sa le cereti lor sa activeze modului rewrite.

O data ce ai gasit fisierul httpd.conf deschide-l si cauta urmatoarea line (asigurate ca nu este comentata, sterge simbolul # din fata ei) :

Activat: LoadModule rewrite_module modules/mod_rewrite.so

Dezactivat: #LoadModule rewrite_module modules/mod_rewrite.so

O data ce ai activat modulul trebuie sa restartezi serverul apache pentru a se produce schimbarea.

Hai sa intelegem ce face modul Rewrite

Mod_Rewirite este procesul de curatare al URL-urilor:

Link inainte de mod_rewrite:
http://siteulmeu.com/index.php?page=search&type=post

Link dupa mod_rewrite:
http://siteulmeu.com/search/post

Avantaje:
-link-urile search engine friendly
-usor de citit/tinut minte pentru utilizatori
-protejarea detaliilor despre modul in care aplicatia ta web este implementata

Serverul apache fara modul rewrite activat nu ar intelege structura http://siteulmeu.com/page/about-us/ .El ar intelege sa se duca in folderul page in care va gasi alt folder about-us.

In esenta ce face acest mod_rewrite este sa le afiseze utilizatorilor link-uri prietenoase, iar link-urile de genul index.php?p=about-us sa ramana ascunse.

Configurare mod_rewrite

In folderul radacina (public_html sau /, depinde de host) al site-ului tau creeaza un fisier .htaccess acesta fiind fisierul care controleaza modul rewrite

In exemplul de fata fisierul .htaccess va avea urmatorul cod in el

RewriteEngine On    # Turn on the rewriting engine
RewriteRule    ^news/([0-9]+)/?$    news.php?article_id=$1    [NC,L]

Codul de mai sus va modifica link-urile in modul urmator: http://siteulmeu.com/news/357 chiar daca inainte link-ul arata de genul http://siteulmeu.com/news.php?article_id=357.

Prima parte: Pornirea modului

RewriteEngine On

Acest cod anunta serverul apache ca vrei sa folosesti mod_rewrite pentru fisierele din directorul radacina.

Trebuie sa scrii codul de mai sus de fiecare data cand vrei sa folosesti mod_rewrite.

Primele 2 randuri nu sunt neaparat necesare, presupunand ca deja sunt setate in httpd.conf.
Dar, pentru a fi sigur ca va functiona puneti-le si in fisierul .htaccess.

A doua parte: Regulile de scriere

Regulile de rescriere sunt create folosind expresii simple. Acestea ii spun serverului Apache sub ce tipar sa intreprinda anumite actiuni.

Regulile de rescriere

Regulile de rescriere apar in urmatorul format de regular expression

REGEX_PATTERN

Pentru a simplifica cat de cat acest articol/ghid am sa presupun din start ca aveti cunostinte minime despre REGEX. Daca nu aveti nicio idee despre ce vorbesc aici va recomand sa cititi despre Regular Expressions (REGEX) si cum sa le creati.

Sablonul REGEX este cel pe care apache va incerca sa il compare de fiecare data cu url-ul pe care il intampina. Daca expresia se potriveste acesta va urma regula de rescriere.

PAGE_ADDRESS

Este exact ce scrie mai sus, adresa paginii tale pe server.

Sa luam ca exemplu ce am scris mai sus, vrem sa scriem in bara de adrese http://siteulmeu/news/id si sa proceseze pagina de stiri la stirea cu id-ul respectiv. Evident, nu am pe server cate un folder pentru fiecare sectiune a site-ului, pagina de stiri fiind numita simplu news.php si situata in folderul radacina al hostului.

PAGE_ADDRESS in exemplul acesta este news.php?news_id=, presupunand ca acesta este modul de functionare al scriptului tau.

PATTERN_MATCH

In REGEX potrivirea de tipar este raportata ca $n, unde N este numarul potrivirii.
De exemplu, sa spunem ca avem o expresie ca asta:

^search/(.*)/(.*)/apples/(.*)/oranges/(.*)$

Daca in bara de adrese aveti adresa urmatoare: http://siteulmeu.com/search/OMG/THIS/apples/IS/oranges/COOL

REGEX va gasi urmatoarele potriviri:

$1 = “OMG”
$2 = “THIS”
$3 = “IS”
$4 = “COOL”

Ideea este ca simbolurile (.*) inseamna ca sunt acceptate orice fel de caractere in acel loc din link.
$1, $2, $n acestea sunt expresiile REGEX la care te referi, deci primul (.*) reprezinta $1, al doilea $2 si asa mai departe.

Sa le punem impreuna!

Sa spunem ca vreau sa folosesc expresia specificata mai sus  (^search/(.*)/(.*)/apples/(.*)/oranges/(.*)$) si sa spunem ca vreau atunci cand scrii asta in bara de adrese sa te trimita pe o pagina search.php iar in aceasta pagina vreau sa rulez un script de cautare.

Daca acum merge la adresa http://siteulmeu.com/search/OMG/THIS/apples/IS/oranges/COOL scriptul de cautare valua dreapt search_id ultima valoare, respectiv “COOL”.

Reguli de rescriere: Steaguri

Steagurile sunt cele ce te ajuta sa iti personalizezi modul in care functioneaza regulile de rescriere. Exista o multime de asemenea steaguri, dar in acest articol am sa scriu decat despre cateva ca deja am scris mult prea mult.

[L] – Last
Daca puneti acest steag intr-o regula de rescriere serverul va inceta sa mai execute ce se afla dupa aceasta.

[R] – Redirect
Aceasta va executa redirect si va trimite statusul si noua locatie browserului, asfel acesta va updata adresa din bara de adrese.

[QSA] – Query String Append
Pe paginile dinamice QSA contine datele din GET (ex: ce se afla dupa ? in bara de adresa). Daca nu incluzi un query string in destinatie atunci originalul va fi transferat automat.

[NC] – No Case
Face modul de comparatie insensitive.

Sunt un tanar programator din Bucuresti ce lucreaza in PHP/Mysql (MySqli/PDO), Laravel, CodeIgniter, MySQL, PostgreSQL, Wordpress, HTML5/CSS3, Sass, Photoshop si multe altele.
Google+ Community Facebook Group
Acest articol a fost mutat de pe vechea platforma.
Pentru orice eroare aparuta la mutare va rog sa ma contactati!