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
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]
Számos rendszerváltozó használható az átirányítások feltételeként. A legfontosabbak az alábbiak:
Változó/th> | Jelentés | Használata |
---|---|---|
HTTP_USER_AGENT | a böngésző, vagy az oldalt lekérdezőbot fajtája | Pl. a googlebot, vagy más botok kitiltása, más oldalra irányítása |
HTTP_REFERER | a hivatkozó honlap | Pl. képeink más oldalba illeszésének tiltása |
HTTP_HOST | amilyen oldalként kivatkoztak ránk | www vagy anélküli oldalak, aldomainek átirányítása |
REMOTE_ADDR REMOTE_HOST | a kérdező IP-je, ill. hostneve | Más nyelvi aloldalakra irányítás IP/host alapján |
QUERY_STRING | lekérdező string, a linkben a ? utáni rész | A linkben a ? utáni részek feldolgozása |
TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIME | Szerver idő paraméterek | idő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_REQUEST | A böngésző által küldött teljes kérés, pl. "GET /index.html HTTP/1.1"). | pl. POST tiltás, stb. |
REQUEST_URI | A kért link, hostnév nélkül, pl. /index.html"). | ugyanaz, mint RewriteRule első paraméterénél |
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]
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 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
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ó.