Ce este URL Rewriting?
Cele mai multe site-uri dinamice includ variabile in adresele URL, care spun site-ul ce informații sa arate utilizatorului. De obicei, acest lucru ofera URL-uri cum ar fi urmatoru, spunind scriptului relevant de pe site sa incarce produsul cu numarul 7.
http://www.asite.com/products.php?product_id=7
Problema cu acest tip de structura URL este ca URL-ul nu este deloc memorabil. Este greu pentru a citi prin telefon. Motoarele de cautare și utilizatorii nu primesc nici o informatie utila de la acel URL. Este un URL destul de standard - un fel de sortare in mod implicit la majoritatea CMS-uri. Sa-l comparam cu acest URL:
http://www.asite.com/products/7/
In mod clar URL-ul este mult mai curat și mai scurt. Este mult mai usor sa-l tineti minte, si mult mai usor sa-l cititi. Insa URL-ul nu ne ofera o informatie mai detaliata despre produs. Dar putem face mai mult:
http://www.asite.com/dogs/huskey/
Acum stim cu exactitate care e produsul
Basic URL Rewriting
Ca sa intelegem mai bine sa luam un exemplu cum ar fi
http://www.pets.com/pet_care_info_07_07_2008.php si dorim sa-l facem in
http://www.pets.com/pet-care/Pentru a efectua aceasta 'conversie' avem nevoie de un fisier numit
.htaccess (nu .htaccess.txt sau settings.htaccess).
Fisierul .htaccess este un file de configuratii pentru server. Daca se va gasi vre-o eroare in fisier ar trebui sa primiti error de tip "500".
RewriteEngine On # Pornim masina de rewriting
RewriteRule ^pet-care/?$ pet_care_info_01_02_2015.php [NC,L] # Tratam solicitarile pentru "pet-care"
Linia cu RewriteRule face toata treaba astfel :
- RewriteRule - Spune serverului ca se refera doar la un singur RewriteRule.
- ^/pet-care/?$ - "Modelul". Serverul va verifica URL-ul de fiecare cerere al site-ului pentru a vedea daca acest model se potriveste. Dacă da, atunci Apache va schimba URL-ul cererii din sectiunea "Schimbare", care urmeaza.
- pet_care_info_01_02_2003.php - "Schimbarea". In cazul în care modelul de mai sus se potriveste cererii, Apache utilizeaza această adresa URL în loc de URL-ul solicitat.
- [NC,L] - "Steaguri", care spun Apache cum sa aplice regula. In acest caz, vom folosind doua steaguri. "NC", spune Apache ca această regula ar trebui sa fie de 'caz insensibil', si "L" spune Apache sa nu mai proceseze mai multe reguli, asta este ultima(de la Last).
- # Tratam solicitarile pentru "pet-care" - Comentariu
Dar! Daca avem nevoie de produse si id-urile lor atunci avem:
http://www.site.com/show_a_product.php?product_id=7 - Original
http://www.site.com/products/7/ - cum dorim sa arate
RewriteRule ^products/([0-9]+)/?$ show_a_product.php?product_id=$1 [NC,L]
Si dupa cum vedeti la "Model" am pus
[0-9]+ unde 0-9 reprezinta toate numele posibile sa fie prezente(toate numerele) iar acel + inseamna ca pot fi id-u poate fi format din mai multe numere (gen: 59). Iar la product_id=
$1 am folosit ca sa potrivim numarul cu cel din "Model", iar daca avem mai multe numere in Model vom folosi si $2 $3 si asa mai departe
Insa din nou, DAR daca dorim sa rescriem URL-ul, dar sa folosim alta extensie, vom scrie tot asa sau altfel? Pai e putin altfel
Singuru lucru care trebuie sa-l facem este sa adaugam un Slash (bara oblica). Sa luam exmplu file-u rss, din php sa-l schimbam in xml, iar codu ar trebui sa fie:
RewriteRule ^rss\.xml$ rss.php [NC,L] # Schimbam URL-ul feed
Si inca odata DAR!!!! Daca id-ul reprezinta litere nu numere cum facem? Pai simplu, oferim in "Model" un 'array' de la 'A' la 'Z' si desigur de la 'a' la 'z', vom folosi
[A-Za-z-], iar codul ar fi:
RewriteRule ^dogs/([A-Za-z0-9-]+)/?$ get_product_by_name.php?product_name=$1 [NC,L]
[A-Za-z0-9-]+ ar inseamna ca se folosesc toate literele si numerele
Dar daca dorim sa scriem mai multe 'Reguli' vom folosi:
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ get_product_by_name.php?category_name=$1&product_name=$2 [NC,L] # Products
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ get_blog_post_by_title.php?category_name=$1&post_title=$2 [NC,L] # Blog Posts
Si va iesi cam asa
/categorie/titlu.
Asta cam a fost esentialul pana acum
Trecem la urmatoarea etapa
Mutarea continutului
RewriteRule ^article/?$ http://www.new-domain.com/article/ [R,NC,L] # Mutare temporara
Adaugarea lui "R" la "Flaguri" schimba Rewrite Rule-ul. Astfel Apache va transmite un mesaj la browser (HTTP Header) caci documentul s-a mutat
temporar la URL dat in "Schimbare". Daca dorim sa afiseze caci documentul s-a mutat permanent pe un anume URL vom folosi
"R=301" si va iesi cam:
RewriteRule ^article/?$ http://www.new-domain.com/article/ [R=301,NC,L]
BONUS!! Variabilele serverului
HTTP Headers- HTTP_USER_AGENT
- HTTP_REFERER
- HTTP_COOKIE
- HTTP_FORWARDED
- HTTP_HOST
- HTTP_PROXY_CONNECTION
- HTTP_ACCEPT
Variabile de conexiune- REMOTE_ADDR
- REMOTE_HOST
- REMOTE_USER
- REMOTE_IDENT
- REQUEST_METHOD
- SCRIPT_FILENAME
- PATH_INFO
- QUERY_STRING
- AUTH_TYPE
Variabilele serverului- DOCUMENT_ROOT
- SERVER_ADMIN
- SERVER_NAME
- SERVER_ADDR
- SERVER_PORT
- SERVER_PROTOCOL
- SERVER_SOFTWARE
Data si timp- TIME_YEAR
- TIME_MON
- TIME_DAY
- TIME_HOUR
- TIME_MIN
- TIME_SEC
- TIME_WDAY
- TIME
Special- API_VERSION
- THE_REQUEST
- REQUEST_URI
- REQUEST_FILENAME
- IS_SUBREQ