Howto mod_rewrite part 2

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.

One thought on “Howto mod_rewrite part 2

Comments are closed.