Átirányítás változókkal

A reguláris kifejezéseknél láthattuk, hogy az első "mit" paraméter kellő megadásával igen szélesen le tudjuk fedni az átirányítandó oldalak körét, és ezeket mind egy oldalra tudjuk átirányítani.

Tudunk ennél sokkal többet is, sőt, már példát is láttunk rá. Korábban bemuttattam azt az indiános példát, ahol a linkben mintegy könyvtárnévként szerepelt az indiánok darabszáma, és ezt a php file paraméterként kapta meg. Idézzük fel az ezt lehetővé tevő htaccess kódot!:

RewriteRule ^indianok/(.*)/?$ indian.php?count=$1

Elemezzük ki, mit is jelent ez a kód pontosan!

Az átirányítandó elemzése

Először nézzük azt meg, mit is irányít át. A ^indianok/ miatt mindenképpen úgy kezdődik, hogy indianok, amit rögtön egy / jel követ.

Ezután jön egy (.*) kifejezés. Ez mit is jelent konkrétan? A reguláris kifejezések adják meg az értelmezést: A pont jelent bármilyen karaktert, a * pedig a bármilyen karakterből vett akárhány darabot. Mit is jelent ez? Tetszőleges szöveget. A .* tehát tetszőleges szöveget jelent. Mindez a .* egy zárójelben szerepel. A zárójel egyik jelentése sima csoportba foglalás, a második a változóba mentés. Így tehát az indianok/ után álló tetszőleges szöveget elmentettük egy változóba. Hurrá, megvan a változónk!

A (.*) után van még egy /?$ Kifejezés is. Ez vajon mit jelenthet? A $ jel nyilván az átirányításban a "mit" végét jelenti. A / jelenti a perjelet, a ? pedig azt, hogy ebből pontosan nulla vagy egy darab van. Összesen tehát a /?$ azt jelenti, hogy nulla vagy 1 darab / jelre végződik az átirányítandó kifejezés. Ennek vajon mi lehet az értelme, ha előtte a (.*) lefedett minden lehetséges kifejezést?

Ha olyan weboldalakat nézegetünk, ahol az egyes aloldalaknál "szépen" néznek ki a linkek, akkor többségében olyan oldalakat találunk, hogy minden egyes link / jelre végződik. Vannak ugyanakkor szép számmal olyanok is, ahol nem / jelre, hanem csak simán valamilyen betűre vagy számra végződnek. Mivel a felhasználók mindkettőt ismerik, célszerű úgy felkészíteni az oldalunkat, hogy minkét verzóban működjön. A /? kifejezés abban segít, hogy ha / jelre végződik a link, akkor a változóba csak a / jel előtti részek kerüljenek be.

Nézzük meg példán keresztük, úgy sokkal egyszerűbb megérteni. Az első esetben legyen a RewriteRule első eleme a /? nélküli verzió, azaz

^indianok/(.*)$
Ekkor

  • /indianok/43 esetében a változó értéke ez lesz: 43
  • /indianok/43/ esetében a változó értéke ez lesz: 43/

Az második esetben legyen a RewriteRule első eleme a /? elemet tartalmazó verzió, azaz
^indianok/(.*)/?$
Ekkor

  • /indianok/43 esetében a változó értéke ez lesz: 43
  • /indianok/43/ esetében a változó értéke szintén 43 lesz, / nélkül

A /? használatával elérhettük tehát, hogy a változóba minden esetben csak a / nélküli érték kerüljön be.

Az átirányított elemzése

Most már sikerült az átirányítandó elemet úgy feldolgoznunk, hogy a változtatható része bekerült egy változóba. Most már csak valahogy fel kell tudnunk használni az átirányítási cél megadásánál. Erre szolgál a $1 megadás.

Az átirányítandó elemben meghatározott változóknak nincs külön neve, csak sorszámozott meghatározása. Ha csak egy változót határoztunk meg, akkor annak $1 lesz. Ha kettő is van, akkor a második neve $2 és így tovább.

Vegyünk egy példát, ahol a linkben típusa /megye/varos/, és a megye illetve város paramétereket az index.php-ban dolgozzuk fel. Ekkor pl. ez lehet egy átírási utasítás a htaccess-ben:

RewriteRule ^/(.*)/(.*)/?$ index.php?megye=$1&varos=$2;