Feltételes átirányítások

A RewriteRule utasítás nagyon hatékony, de önmagában alkalmazva van egy jelentős korlátja: amikor a "mit" paramétert értelmezi, akkor kizárólag a hostnév utáni részt nézi, és azt is csak a cgi, php stb. paraméterek kezdetéig

Vegyünk például egy ilyen URL-t:

http://peldak.htaccess.petertoth.hu/pelda1/index.php?id=19

Ebben a példában a RewriteRule első paramétere mindössze az alábbi lenne:

pelda1/index.php

Azaz, a ? utáni részeket, illetve magát a host nevet nem látja

Szerencsére ezen korlát feloldásában segít nekünk a feltételes átirányítás. Ennek szerkezete a következő:
Options +FollowSymlinks
RewriteEngine on
RewriteBase /

RewriteCond %{feltételnév} feltételérték 
RewriteRule mit mire

A feltétel elég rugalmas, nagyon sok dolgot meg lehet oldani ilyen módon. A hostnevet pl. a HTTP_HOST azonosítja, ezzel lehet magára a host nevére feltételt megadni.

Tipikus eset, hogy az oldalunkat kétféleképpen lehet elérni, www-s és www nélküli változatban. Mivel sokan hol így, hol úgy gépelik be, célszerű a kettő közül kiválasztani egy verziót, és a másikat átirányítani rá. A www nélküli verzió átirányítása pl. így történik a RewriteCond és a HTTP_HOST alkalmazásával:

RewriteCond %{HTTP_HOST} ^petertoth\.hu [NC]
RewriteRule ^(.*)$ http://www.petertoth.hu/$1 [R=301]

RewriteCond használata

Feltételes változók

Számos rendszerváltozó használható az átirányítások feltételeként. A legfontosabbak az alábbiak:

Változó/th>JelentésHasználata
HTTP_USER_AGENTa böngésző, vagy az oldalt lekérdezőbot fajtájaPl. a googlebot, vagy más botok kitiltása, más oldalra irányítása
HTTP_REFERERa hivatkozó honlapPl. képeink más oldalba illeszésének tiltása
HTTP_HOSTamilyen oldalként kivatkoztak ránkwww vagy anélküli oldalak, aldomainek átirányítása
REMOTE_ADDR
REMOTE_HOST
a kérdező IP-je, ill. hostneveMás nyelvi aloldalakra irányítás IP/host alapján
QUERY_STRINGlekérdező string, a linkben a ? utáni részA linkben a ? utáni részek feldolgozása
TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIMESzerver idő paraméterekidőpont szerinti átirányítás, pl. ütemezett karbantartás idejére, vagy adott felhasználói kör adott időszakban (pl. csúcsidő) való tiltása.
THE_REQUESTA böngésző által küldött teljes kérés, pl. "GET /index.html HTTP/1.1").pl. POST tiltás, stb.
REQUEST_URIA kért link, hostnév nélkül, pl. /index.html").ugyanaz, mint RewriteRule első paraméterénél

Feltételek kombinációja

Egymás után több RewriteCond feltételt is lehet írni, amelyek mind ugyanarra az utánuk következő RewriteRule utasításra vonatkoznak. Az átírás akkor teljesül, ha valamennyi RewriteCond feltétel teljesül, azaz AND kapcsolat van közöttük. Lehet OR kapcsolatot is alkalmazni, azt viszont expliciten ki kell írni:

RewriteCond %{valtozo1} feltetel1 [OR]
RewriteCond %{valtozo2} feltetel2
RewriteRule ^(.*)$ http://www.petertoth.hu/$1 [R=301]

Flagek

A fenti példánkban a RewriteCond %{HTTP_HOST} ^petertoth\.hu sor végén egy [NC] jelölést láttunk. Ez ugyanúgy egy flag, mint az [OR] jelölés. Az [NC] jelentése "no case", azaz ezen flag használata esetén a kisbetű- és a nagybetű között nincs különbség. Több flag esetében azokat a kapcsos zárójelen belül vesszővel választjuk el egymástól, azaz pl. [NC,OR] jelölést alkalmazhatunk.

A feltétel megadása

A feltétel megadása ugyanúgy reguláris kifejezésekkel történik, mint a RewriteRule esetében volt. Ezen kívül müködnek a hagyományos egyenlő, kisebb és nagyobb jelek (= < >) is. Ezzel azonban óvatosan bánjunk, ugyanis a < vagy > jel szerinti rendezés lexikografikusan (ABC-sorrendben) történik, azaz pl. 12 nagyobb, mint 111

Változó továbbvitele

A megadott feltételben ugyanúgy generálhatunk továbbvitel céljából változót, mint korábban. Ezz a változót továbbvihetjük a RewriteRule utasításba. A technikai jellegű különbség, hogy itt nem $, hanem % lesz a változó neve. Ettől még a RewriteRule-ban létrehozott változók ugyanúgy működnek.

Ez sokkal egyszerűbben érthető egy példán keresztül. Tegyük fel, hogy néhány subdomaint szeretnénk belül alkönyvtárként kezelni, pl. sd1.valami.hu, sd2.valami.hu, stb. Ekkor alkalmazzuk az alábbi kódot:

RewriteCond %{HTTP_HOST} ^(.*)\.valami\.hu [NC]
RewriteRule ^(.*)$ http://valami.hu/%1/$1 [L]

Itt a %1 jelenti a valami.hu előtti aldomaint, a $1 pedig a link domain utáni részét.Megjegyzés: ahhoz, hogy ez működjön, más feltételek is kellenek, ezekről az egyéb felhasználási területek kapcsán lesz szó.