In prima parte am vazut care este alfabetul mod_rewrite. La ce ne foloseste mod_rewrite?
- SEO ( Search Engine Optimisation)
- Pentru a produce URL-uri “frumoase”
Sa presupunem ca avem un URL de genul: http://www.tfm.ro/cgi-bin/get_docs.cgi?pagina=apache&subpagina=optiuni&optiune=mod_rewrite . Cit de usor este de tinut minte un asemenea URL? Greu , foarte greu. Cu siguranta ca un URL de genul: http://www.tfm.ro/docs/apache/optiuni/mod_rewrite este mult mai usor de tinut minte , este mult mai usor de scris intr-un web browser.
Cum obtinem asta ?
Folosind reguli mod_rewrite. Inainte de a da exemple practice si de a prezenta regula mod_rewrite pentru exemplul de mai sus trebuie prezentate la modul general regulile mod_rewrite.
O regula mod_rewrite are urmatoarea forma:
RewriteRule pattern target [flags]
Patternul este o expresie regulata formata cu ajutorul alfabetului mod_rewrite ( cititi partea 1 pentru detalii). Target-ul este URL-ul catre care se va face redirectarea daca patternul a fost gasit. Cum se face transformarea URL-ului este dictata de flaguri.
Flagurile modifica comportamentului unei reguli mod_rewrite. Si sint peste 15 flaguri in mod_rewrite. O scurta prezentare a lor:
- C – Chain – Regulile sint tratate ca un intreg . Daca o regula nu e indeplinita intregul lant este abandonat
- CO – Cookie – Seteaza un cookie in browserul clientului . CO=Name:Value:Domain[:Lifetime[:Path]]
- E – Env – Seteaza o variabila in environment
- F – Forbidden – Intoarce clientului o eroare de tip 403 . Cu F se pot bloca accesele directe la anumite fisiere ( folositi mod_security pentru asta . nu se recomanda mod_rewrite pentru blocarea de accese )
- G – Gone – Intoarce clientului un mesaj de eroare 410
- H – Handler . Forteaza utilizarea unui anumit handler pentru tratarea fisierului. Se foloseste cu mult succes in urmatoarea situatie: Sa presupunem ca aveti o aplicatie php si doriti sa serviti sursele php ( fisierele phps) . Puteti face asta foarte elegant fara a mai fi necesar sa copiati toate fisierele php in phps , folosind o singura regula mod_rewrite:
RewriteRule (.*)\.phps$ $1.php [H=application/x-httpd-php-source]
- L – Last . Indica faptul ca s-a ajuns la finalul regulilor. Urmatoarele reguli nu vor mai fi procesate si asta aduce un spor MARE de viteza . In special cind aveti fisiere .htaccess foarte mari.
- N – Next – indica mod_rewrite sa reia regulile de la inceput. Poate fi folositor cind e necesar “search and replace” global. Dar pe de alta parte poate fi o foarte buna capcana de a trimite mod_rewrite in bucla infinita. A se utiliza cu foarte , foarte mare atentie.
- NC – No case . Indica mod_rewrite ca aceasta regula nu este case sensitive. Expresiile regulate mod_rewrite sint case sensitive.
- NE – No escape . Dezactiveaza comportamentul implicit de a escapa caracterele speciale ( ? , # , etc). Este folositor cind doriti sa sariti la un “page anchor” #tag
- NS – No subrequests. Regula nu se va aplica la subrequesturi.
- P – proxy . Regulile sint servite via un subrequest intr-un proxy . Este necasar mod_proxy pentru a functiona.
- PT – passthrough . URL-ul rezultat este retrimis catre prelucrare ca si cum ar fi URL-ul original.
- QSA – qsappend . Adauga la URL-ul rezultat in loc sa inlocuiasca parametrii
- R – redirect . forteaza un Apache redirect ( eroare 302 ) . Noul URL va fi vizibil in browserul clientului.
- S – skip . Sare urmatoarele n reguli din mod_rewrite
- T – type. Foteaza mime-type-ul fisierului rezultat
Am terminat cu flagurile. Ce se mai poate face cu mod_rewrite ? Regulile pot fi executate conditional. Pentru asta exista Rewritecond. Forma directivei este:
RewriteCond TestString Pattern [Flags]
Se pot verifica in RewriteCond variabile de environment , headere , stringuri. Se pot face astfel o gramada de trucuri.
De exemplu anumite pagini sa nu fie accesibile decit intre anumite ore, sau lansarea automata a unei bucati a unui site se poate realiza foarte simplu cu o regula in .htaccess:
RewriteEngine on
RewriteCond %{TIME_HOUR}%{TIME_MIN} >0900
RewriteRule ^page\.html$ lansare.html
Redirectarea intre http si https se poate face de asemenea foarte simplu:
RewriteCond %{HTTPS} !ON
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R]
Nu am ajuns inca la exemplificarea de la inceputul postului . O sa las asta pentru partea a treia a howto-ului.
Cand va aparea partea a 3-a ?
BTW: Interesant articolul. La mai multe !
Comments are closed.