Y2K`
Elite Member
Din: 666
Inregistrat: acum 18 ani
Postari: 970
|
|
Deci, ce mai e şi mod_rewrite (botezat şi modrewrite sau mod rewrite) ăsta? Pe scurt: o metodă de a rescrie URL-uri on the fly.
Motive pentru rescrierea URL-urilor sunt multe:
* uşurinţa de memorare a adreselor de către utilizatori
* estetica
* 1337 ph33lin' :mrgreen:
* indexarea mai facilă de către motoarele de căutare (o mare vrăjeală, BTW, nu mai e cazul de ceva ani)
* poate şi altele
Mulţi încearcă s-o facă, atraşi de ideea că asta o sa-i propulseze pe primele locuri în motoarele de căutare. Problema e că de obicei nu prea ştiu ce scriu/fac paste în .htaccess-ul ala "care este" (treaba le pare un fel de voodoo).
Acest tutorial încearcă să-i lămurească pe cei dispuşi să înveţe. Majoritatea informaţiei de aici provine chiar din manualul lui mod_rewrite.
Încă ceva: nu veţi găsi aici copy'n paste ready code… Sorry, dar va trebui să vă folositi creierul pe care vi l-a lăsat statul :twisted: . Astea fiind spuse, să-i dăm drumul.
Noţiuni de bază
Cu mod_rewrite se pot face o groază de chestii, dar scopul nostru e să avem URL-uri sexy, nu? Pentru asta, trebuie stăpânite 4 directive de configurare pentru Apache, şi aşa-numitele Perl-compatible regular expressions (PCRE). Să le luăm pe rând.
Directivele de configurare
Fişierele de configurare pentru Apache sunt compuse din aşa-numitele directive. Acestea sunt nişte comenzi care pot avea unul sau mai mulţi parametri, şi fiecare modul încărcat adaugă setul propriu de directive la cel deja recunoscut de apache. Din ce ştie mod_rewrite, utile scopului nostru sunt următoarele directive:
* RewriteEngine: controlează dacă se face rescrierea URL-urilor, şi are un singur parametru care poate fi on sau off (evident că trebuie să fie on )
* RewriteBase: îi spune motorului de rewrite care este calea relativ la care face rescrierea; această cale este extrasă din URL, şi este adăugată la loc după ce au fost evaluate regulile de rescriere. Are un singur parametru, care e o care relativă la document root (de exemplu, site-ul ăsta are RewriteBase /~iacobs/)
*
RewriteCond: poate fi folosită pentru a condiţiona evaluarea directivei RewriteRule următoare. Are 3 parametri:
o valoarea care se testează (pe noi ne interesează numai %{REQUEST_FILENAME}, lista completă e dată in link-ul de mai sus)
o testul propriu-zis, testele care ne interesează pe noi fiind -f şi -d
o un flag opţional care poate fi NC(nocase) sau OR(ornext).
Practic, RewriteCond ne interesează numai pentru a verifica dacă adresa cerută e un fişier (-f) sau director (-d) pe disc, caz în care nu mai efectuăm rescrierea URL-ului. De obicei, partea de RewriteCond apare pe la început, şi conţine un
Code:
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.*$ - [L] |
* RewriteRule: cea mai importantă directivă, e cea care face rescrierea propriu-zisă. Are 3 parametri, ca şi RewriteCond:
o URL-ul de rescris, relativ la RewriteBase (PCRE)
o adresa cu care să-l înlocuiască
o flag-uri
De toate astea mă voi ocupa mai pe larg în continuare, când voi vorbi despre…
Regular Expressions
Şi am ajuns la partea cea mai importantă, expresiile regulate sau PCRE. O să mă ocup de ele cât mai concis cu putinţă (pe tema asta s-au scris cărţi întregi). So:
Operatorii cei mai importanţi
* (): grupare; pe scurt, când expresia dintre paranteze selectează un text, acesta este păstrat într-o variabilă:
o $1 pentru prima paranteză,
o $2 pentru a 2-a,
o …
ordinea variabilelor e dată de ordinea deschiderii parantezelor, deci (expr1(expr2)) va pune în $1 textul selectat de paranteza din exterior şi în $2 pe cel selectat de paranteza din interior.
* []: clasă de caractere; poate să conţină o listă de caractere gen [abc123,>] sau un interval, ca [a-z0-9], acestea putând fi combinate între ele, ca în [a-zA-Z0-9,:].
Funcţionalitate: selectează oricare dintre caracterele din listă - ultimul exemplu o sa selecteze orice literă mică sau mare, cifră, virgulă sau 2 puncte, lucru folositor atunci când vrem să selectăm exact ce date intră în scripturi (de exemplu, dacă ştim că un ID trebuie să fie numeric, folosim [0-9] şi eliminăm datele aiurea încă înainte să ajungă la script).
Pentru a nega selecţia, se pune ^ la începutul listei.
* : escape; îi spune parser-ului de PCRE să trateze următorul caracter ca pe unul normal, permiţând să se selecteze şi ()[]. etc.
* . (punct): selectează orice caracter
* ^: selectează începutul de rând
* $: selectează sfârşitul de rând
* |: alternare, abc|def selectează abc sau def
Cuantificatori
Ne permit să specificăm de câte ori are voie să ruleze (selecteze caractere) o expresie.
* *: selectează de 0 sau mai multe ori; ex: .* găseşte orice text de orice lungime, inclusiv textul nul
* +: selectează de 1 sau mai multe ori; ex: .+ găseşte orice text de cel puţin un caracter lungime
* ?: selectează de 0 sau 1 ori; ex: .? găseşte orice text de cel mult un caracter lungime
* {n}: selectează de exact n ori; ex: a{3} găseşte aaa
* {m,n}: selectează între m şi n ori; ex: a{1,3} găseşte a, aa, aaa; selecţia încearcă întotdeauna să găsească cel mai lung text posibil
* {n,}: selectează de cel puţin n ori; ex: a{3,} găseşte orice înşiruire de a mai lungă de 3 caractere.
EXEMPLE
Din exemple se învaţă cel mai bine:
Code:
RewriteRule ^pages/(home|about).html$ index.php?page=$1 [L] |
Explicaţii: atunci când cineva cere
serverul va afişa pagina
Un exemplu mai complex:
Code:
RewriteRule ^magazin/raft([0-9]+)/produs([0-9]+).html$ shop.php?cat=$1&prod=$2 [L] |
Explicaţii: atunci când cineva cere
http://www/example.com/raft20/produs5.html,
va primi
OK, vă ajunge pentru azi, dragii moşului! La muncă!
SURSA
Modificat de Shocker (acum 17 ani)
|
|