Htaccess krajšanje urljev
2 naročnika
2 naročnika
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 %{REQUESTFILENAME} !-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...
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.