Az előző részben egy nagyon egyszerű megoldást kínáltam a szép url-ekhez. Ami csak nagyon korlátozottan, néhány lapból álló honlapok esetén hatásos. Ebben a cikkben egy, jelenleg formájában egyszerű, de akár bonyolultabb működésre is képes alternatívát mutatok be.
<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
</ifmodule>
Ebben a mintában csak egy pont található. A pont jelentése: egy tetszőleges karakter, így a szabály az, hogy ha a fájlnév legalább egy karakter hosszú, akkor az index.php-t fogja futtatni.
Ez azt is jelenti, hogy minden további teendőt rábízunk az index.php-ra. Neki kell majd eldönteni, milyen további php-ket futtat.
Az egyedüli, amire támaszkodhat, az a $_SERVER szuperglobális tömb, ami tele van hasznos adatokkal, egyik belőle az eredeti url, amit a webszerver megkapott. Ez egyrészt a $_SERVER['REQUEST_URI']-ből nyerhető ki, másrészt a $_SERVER['REDIRECT_URL']-ben is benne van. Utóbbi azért jobb, mert ha jön GET paraméter, akkor míg az REQUEST_URI-ban ez benne lesz, addig a REDIRECT_URL-ben már nem.
Maga az index.php pedig így néz ki:
<? if ( isset($_SERVER['REDIRECT_URL']) ) { // átirányítás volt $_ru = substr( $_SERVER['REDIRECT_URL'], 1 ); // az url mélység szerinti szétbontása a /-ek mentén $_rp = explode( "/", $_ru ); // én egy alkönyvtárba raktam, így szükséges az első könyvtárat törölni // ha két mélységben lenne, pl. /proba/site, akkor 2x kellene, stb. array_shift( $_rp ); } else { // nem volt átirányítás, az alapértelmezett oldal kiválasztása: $_ru = "index"; // az index $_rp = explode( "/", $_ru ); } // ellenőrizzük, hogy a kívánt url csak az angol kisbetűt tartalmazza-e: if ( preg_match( "/^[a-z]+$/", $_rp[0] ) ) { // ha igen, akkor szükséges még megvizsgálni, hogy létezik-e az oldal, // azaz van-e ilyen nevű php fájl a pages könyvtárban: if ( file_exists( "pages/".$_rp[0].".php" ) ) { // ha létezik, akkor meghívjuk include "pages/".$_rp[0].".php"; } } ?>
A kód, azt hiszem, egy kis tanulmányozás után megérthető, ennek érdekében kommentálva is van. Észrevehető, hogy mintaillesztés itt is történik, csak itt php-ben. Erre itt biztonsági okokból van szükség.
A beüzemeléshez fontos információk:
attól függően, milyen mélységben rakjuk alkönyvtárba, szükséges további array_shift-es sorokat berakni, vagy ha a domain gyökérkönyvtárába raktad, akkor arra az egyre sincs szükséged (most egy mélység van beállítva, azaz pl. itt fog működni: http://localhost/kiprobalom/ )
szükséges létrehozni egy pages könyvtárat, amibe a kívánt oldalakat létre kell hoznod php fájlok formájában pl. ha a 'kiprobalom' könyvtárba készítetted, akkor azon belül legyen egy pages könyvtár és abban egy index.php és a többi kívánt oldal, pl. a kapcsolat.php a http://localhost/kiprobalom/kapcsolat megtekintésekor fog futni
a $_rp tömb tartogat viszont még valami hasznosat, ami akkor használható fel, ha a fájlra mint könyvtárra gondolunk. például http://localhost/kiprobalom/webshop esetén a pages/webshop.php fut, de mi lenne, ha ezen belül is szép urleket akarunk? Mint már utaltam rá: $_rp tömbben minden információ ott van. http://localhost/kiprobalom/webshop/kategoria/szoftverek webcím esetén is a pages/webshop.php indul el, így adja magát, hogy azon belül vizsgáljuk meg a $_rp[1] értékét, ha 'kategoria', akkor további vizsgálatot csinálhatunk $_rp[2] értékére, ha "szoftverek", akkor ki kell rakni a webáruházban található szoftver kategóriájú termékeket. Ugyanez a megoldás cikkek, blog vagy bármilyen más, könyvtár tulajdonságú honlaprésznél.
Ez az egyszerű átirányítás megnyitja a kaput a saját keretrendszer készítése előtt, amivel olyan gyors honlapkészítés és -fejlesztés érhető el, amely nélküle sehogy. A következő cikkek már erről fognak szólni.