Htaccess krajšanje urljev

Rad bi v .htaccess uredil par urljev, ki so zdaj v obliki domena.com/mapa/blabla?3252465. Zanima me, kako bi stran funkcionirala v obliki domena.com/mapa/blabla, obenem pa bi se rad tudi kaj uporabnega naučil, ampak bolj kot gledam, manj mi je jasno. Ima morda kdo tu kak uporaben predlog oziroma delujoč primer, da lahko sprobam?

4 odgovori

Začneš tako, da v htaccess postaviš nekaj takega:

RewriteEngine On
RewriteCond %{REQUESTFILENAME} !-f
RewriteCond %{REQUEST
FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

Prva vrstica pomeni, da se vklopi mod_rewrite, ki mora biti nameščen na apache. Prav tako mora v apache.conf biti določeno

AllowOverride FileInfo

ali

AllowOverride All

ki prepriča apache, da upošteva Rewrite v .htaccessu

Druga in tretja vrstica (RewriteCond) sta zato, da se url rewrite izvede samo, če datoteka (-f) in direktorij (-d) NE obstajata.

Zadnja vrstica je dejanski rewrite. Kar naredi je to, da karkoli vpišeš po tisti mapi, v kateri se .htaccess nahaja, bo request še vedno obdelal index.php.
Če želiš izvedet, kaj dejansko je bilo poslano, moraš to obdelat v php. Izpišeš si vrednost spremenljivke $_SERVER in gledaš, kaj se dogaja, ko spreminjaš url.

Za bolj kompleksne rewrite se moraš poglobit v regular expressione. Ampak načeloma zgornje 4 vrstice zadoščajo, če vse requeste obdela index.php, razen za tiste datoteke, ki obstajajo (npr pripadajoče slike, stylesheet, skripte...)

Toliko za začetek, za več pa, veselo na delo in eksperimentirat...

3

Hvala, to sem tudi sam že ugotovil. Problem pa je v tem, da sploh ne vem, kako bi se res lotil napisati rešitev, nikjer ni nobenega vsaj približno podobnega primera. Kar sem gledal je vse precej specifično, ali pa je po dvanajst rešitev za isti problem, pa nobena ne dela.

Najbolj klasične rešitve so takšne, da je url rewrite:

RewriteRule ^(.*)$ index.php?cmd=$1 [L,QSA]

V tem primeru imaš tralala/neki rewritano v index.php?cmd=tralala/neki

Če imaš pripravljeno neko podatkovno bazo vsebin, kjer je eden izmed stolpcev recimo SEOfancyurl, lahko vrednost $_GET-a 'cmd' pošlješ v bazo in dobiš na ta način prave podatke ven in pokažeš vsebino, namesto da kličeš index.php?id=123. Deluje na isti način, le poizvedba sprašuje po drugem polju.

1

S kar nekaj kolobarjenja sem prišel do delujoče rešitve. Pravzaprav zadeva pač izbriše cel query string, kar reši moj problem:

RewriteEngine On
RewriteCond %{QUERY_STRING} .
RewriteRule ^(.*)$ $1/? [R=301,L]

Zdaj je seveda vse precej bolj jasno, edino ne vem, kaj dela ta ? na koncu RewriteRule?