Fie url-urile drăguţe cu .htaccess


Într-un articol de săptămâna trecută am vorbit despre o forţare, astfel ca să fie Slash la final de adresă web. Răzvan a cerut un exemplu concret şi îl dau acum, cu ceva întârziere. Ca să fie uşor de înţeles l-am făcut foarte simplu, adică destul de stupid dar totuşi didactic. Exemplul poate fi văzut şi testat la următoarea adresă http://www.cnet.ro/wp-content/uploads/php/demourl/, director în care sunt două fişiere .htaccess şi index.php. Pagina PHP afişează conţinutul după cum sunt doi parametri: sectiune şi optiune. Dar aceşti parametrii nu se văd în URL!!! Da!

Ar putea fi folosiţi în modul clasic. Testaţi următoarele linkuri şi veţi vedea că dau acelaşi lucru:

http://www.cnet.ro/wp-content/uploads/php/demourl/contact/adresa/
http://www.cnet.ro/wp-content/uploads/php/demourl/index.php?sectiune=contact&optiune=adresa

Evident că primul arată mai frumos decât al doilea. Cum se face? Descărcaţi arhiva cu cele două fişiere şi studiaţi. Evident, pe orice alt server le puneţi, codul trebuie puţin adaptat. În principiu e vorba de căi. Iată pentru .htaccess ce am folosit:

Options +FollowSymlinks
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.cnet.ro/wp-content/uploads/php/demourl/$1/ [L,R=301]

RewriteRule ^([^/]+)/$ /wp-content/uploads/php/demourl/index.php?sectiune=$1&optiune=nimic [NC,L]
RewriteRule ^([^/]+)/([^/]+)/$ /wp-content/uploads/php/demourl/index.php?sectiune=$1&optiune=$2 [NC,L]

Pagina PHP are imediat după body un scurt cod HTML (îl puteţi vedea şi uitându-vă în sursă, dar îl dau aici explicit):

<base href="http://www.cnet.ro/wp-content/uploads/php/demourl/" />
<a href="">Start</a>
<a href="despre/">Despre</a> 
(<a href="despre/mine/">mine</a> * <a href="despre/tine/">tine</a>)
<a href="contact/">Contact</a> 
(<a href="contact/adresa/">adresa</a> * <a href="contact/harta/">harta</a> * <a href="contact/email/">email</a>)

După care vine partea PHP pură.

$sectiune=strip_tags(ltrim($_GET['sectiune']));
$optiune=strip_tags(ltrim($_GET['optiune']));

if($sectiune=="")
    echo "<p>Start</p>";
else if($sectiune=="despre")
    switch($optiune){
        case "mine":
            echo "<p>Despre mine</p>";
            break;
        case "tine":
            echo "<p>Despre tine</p>";
            break;
        default:
            echo "<p>Despre... generic</p>";
    }
else if($sectiune=="contact")
    switch($optiune){
        case "adresa":
            echo "<p>Adresa pe strada ...</p>";
            break;
        case "harta":
            echo "<p>Latitudine... longitudine...</p>";
            break;
        case "email":
            echo "<p>Email pe GMail</p>";
            break;
        default:
            echo "<p>Date de contact</p>";
    }

Şi uite aşa, în minte, în partea de programare PHP, lucrăm cu parametrii, dar ca şi căi folosim structuri ca de directoare, datorită celor scrise în .htaccess. E simplu. Sper acest exemplu minimalist să ajute.


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (2 evaluări, media: 5,00 din 5)
Loading...Loading...

5 comentarii

  1. razvan spune:

    Radu, multumesc! Inca un articol cu steluta in reader :) . O sa studiez problema, am nevoie si eu pentru un proiect propriu, acum lucrez la alte functionalitati.

  2. razvan spune:

    Am studiat putin codul. Problema mea e un pic mai complicata (pentru mine, ca nu stiu rezolvarea) peste tot folosesc id-uri: index.php?cat=41&subcat=109&page=2. Si as vrea sa arate /numecategorie/numesubcategorie/numarpagina. Relativ simplu, o functie php care sa imi converteasca URL-ul cu iduri in linkul HTML sub forma dorita. Cu htaccess, url_rewrite, si apoi in PHP o functie de prelucrare a url-ului sa imi scoata id-urile din db. Problema mea acum se complica, pentru ca am un formular, generat dinamic, pentru niste filtre, atat numele grupurilor radio cat si valorile butoanelor radio sunt extrase din db.index.php?pret_min=129 &pret_max=899&Producator=Intel& Nuclee=4&Frecventa=3300&cat=41& subcat=109&filtru=Filtreaza. Problema cu filtrele e ca nu pot stabili valori fixe, si nici numarul lor nu e fix. Cum pot eu sa scriu reguli htaccess dinamic?

  3. razvan spune:

    Eh, si tot url-ul acela cu filtre generat dinamic sa arate de forma: /numecat/numesubcat/filtru1/valoare1/filtru2/valoare2…./filtru-n/valoare-n/Filtreaza/numarpagina

  4. razvan spune:

    Revin cu o intrebare: m-am tot jucat cu htaccess si am reusit intrun final sa imi fac rescrierile de url pentru index. Dar as mai avea vreo 2 fisiere la care vreau sa le fac url_rewrite. Am inteles eu gresit, sau doar unui fisier i se pot aplica redirectari?

    adica:
    RewriteRule ^([^/]+)/$ /categorie/index.php?sectiune=$1 [NC,L]
    si
    RewriteRule ^pagini/([^/]+)/$ pagini.php?sectiune=$1 [NC,L]

    Sau nu folosesc eu ce trebuie de nu imi functioneaza. Ms.

  5. razvan spune:

    Sau doar pentru 1 fisier, respectiv index, si trebuie sa imi modific aplicatia astfel incat totul sa se execute in index, si cu un flag in query sa folosesc un switch si sa aplic codul ce trebuie sa se execute.


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *