Keresőbarát URL kialakítása

Keresőbarát (és felhasználóbarát) linkek alatt sok aloldalból álló weblap esetében az alábbi típusú linkeket értjük:
http://htaccesstutorial.infojegyzet.hu/keresobarat-url-kialakitasa/
Nem keresőbarát alatt, amiket el szeretnénk kerülni, pedig az alábbiakat:
http://htaccesstutorial.infojegyzet.hu/index.php?link=keresobarat-url-kialakitasa
http://htaccesstutorial.infojegyzet.hu/index.php?id=300
http://htaccesstutorial.infojegyzet.hu/index.php?megye=Pest&varos=Erd

Előfeltételek

A keresőbarát url-ek használata előtt ellenőrizni kell, hogy fennálnak-e a htaccess, valamint külön az átirányítások használatának előfeltételei.

Egyszintű url

A legegyszerűbb eset kisebb oldalaknál, ha egyszintű url struktúránk van, azaz úgy néz ki, mint pl. ez a honlap, a domainen belül vannak könyvtáraink, de azokon belül alkönyvtárak nem. Ekkor a kód:

RewriteRule ^index.php$ - [L]
RewriteRule ^(.+)/?$ index.php?url=$1 [L]

Itt a második sorban adtuk meg a tényleges átirányítási szabályt, ami minden olyan url-t átirányít, ahol a domain név után van egy / jeltől különböző karakter. Az első sor jelentése szerint az index.php marad saját maga, és itt véget is ér az átírás. Ez azért kell, mert e nélkül az index.php?url=index.php-t kapnánk.

Többszintű url

Vegyük azt az esetet példának, hogy tudjuk, hogy az url struktúra legfeljebb 3 szintből áll. Ekkor a kód:

RewriteRule ^index\.php$ - [L]
RewriteRule ^(.+)/(.+)/(.+)/?$ index.php?par1=$1&par2=$2&par3=$3 [L]
RewriteRule ^(.+)/(.+)/?$ index.php?par1=$1&par2=$2 [L]
RewriteRule ^(.+)/?$ index.php?par1=$1 [L]

Ezzel a kóddal a par1 paraméterbe kerül az első, par2-be a második, par3-ba a harmadik szintre beírt paraméter, ezt már php-ben könnyedén feldolgozhatjuk. Az átirányítási sorok sorrendje fontos, a legmélyebb tagolással kell kezdeni!

Bármilyen url

Nézzünk egy általánosabb esetet, amikor nem tudjuk, hogy milyen mély a könyvtárstruktúra:

RewriteRule ^index\.php$ - [L]
RewriteRule . /index.php [L]

Ezzel a kóddal minden oldalt az index.php-re irányítunk át, miközben nem adunk át paramétert. Mégis, akkor hogy működhet ez a módszer? Hogy használhatjuk így a keresőbarát kifejezéseket?

Nos, még ha direktben nem is adtuk át a kért paramétert az index.php-nek, attól az még megkapja, hogy mi volt a beírt link. Ezt pl. PHP-ben a $_SERVER['REQUEST_URI'] változó kiolvasása adja meg. Ezt felhasználva és feldolgozva könnyedén visszaadhatjuk a felhasználónak az általa kért oldalt.

Fizikai file-ok kizárása

A fenti kódok használatával néha érdekes problémákba futhatunk bele. Láttuk, hogy a fenti kód minden url-t az index.php-ra irányít, így nagyszerűen tudjuk kezelni a "szép" url-eket. Csakhogy van ezzel egy gond: gyakran olyat is átirányítunk vele, amit nem kellene, az oldalunk ugyanis nemcsak a közvetlenül php-ben legenerált oldalakból áll. Vannak fizikailag létező file-ok is, amikre közvetlenül kell hivatkozni, és nem az index.php-n keresztül. Ilyen file pl. az oldal css stílusfile-ja, vagy mondjuk az oldalon megjelenő képek. Ha ezeket is átirányítjuk, akkor nem működik megfelelően az oldalunk.

PÉLDA: Korábban, bemutattam egy olyan alololdalt, ahol az oldalon egy kép is megjelenik. Az alábbi linken lévő alkönyvtáron pontosan ugyanezek a file-ok vannak, csak a htaccess-ben a fenti módon mindent az index.html-re irányítottunk.

/directoryindex3/

Láthatjuk, hogy az oldal szövege valóban ugyanaz, azonban maga a kép nem jelenik meg, csak a kép helye. A kép pedig ottvan, csak a "minden" index.html-re való irányítása azzal a nem szándékolt mellékhatással járt, hogy a kép is átirányítódott az index.html-re, amit ezért nyilván nem tud képként megjeleníteni.

Ezt a problémát úgy küszöbölhetjük ki, ha feltételes átirányítást alkalmazunk, és megadjuk, hogy a fizikailag létező file-ok ne irányítódjanak át.

RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Itt a !-f és a !-d feltételek azt adják meg, hogy az átirányítás csak akkor jön létre, ha a beírt url nem egy létező file (!-f) vagy könyvtár (!-d a directory rövidítéséből)

Gyakorlati példák

A következő fejezetben kielemezzük, hogy egy konkrét népszerű tartalomkezelő (CMS) rendszerben hogy történik a keresőbarát url-ek kialakítása.