További átirányítási szabályok

Lekérdező string levágása

Alapértelmezésben az átirányítás a lekérdező string (linkben a ? és az azt követő részek) utáni rész automatikusan hozzáadódik az átirányított url-hez. Ez néha hasznos, de gyakran el szeretnénk kerülni. Erre az a megoldás, hogy egy kérdőjelet kell tenni az átirányítási cél után.

Nézzük pl. az alábbi két átirányítási szabályt:

RewriteRule ^regiindex\.php$ ujindex.php
RewriteRule ^regiindex\.php$ ujindex.php?

Ha az beírt link regiindex.php, akkor a két szabály ugyanúgy működik. Ha a beírt link regiindex.php?id=35 akkor az első, alapértelmezett verzó esetében az új link ujindex.php?id=35 lesz, és csak a második, ?-re végződő verziónál lesz csak simán ujindex.php

Átirányítások láncolata

Fontos szabály, hogy ha a htaccess-ben több átírás van, és egy korábban lévő végrehajtódik, attól az átírások még nem állnak le, a sorban következő átírás is ugyanúgy kiértékelésre kerül, és végrehajtódik. Ha ezt nem vesszük figyelembe, akkor sok esetben azt hihetjük, hogy a htaccess teljesen érthetetlenül viselkedik.

Ezt a problémát igen könnyen orvosolhatjuk, közölnünk kell a htaccess-el, hogy az éppen érvényes utasítás - amennyiben végrehajtódik - volt az utolsó, és ha ezt végrehajtja, akkor már a többit nem kell figyelembe vennie. Ez a sor végére írt [L] flaggel történik, aholis az L az angol last (utolsó) rövidítése

RewriteRule ^mit$ mire [L]

Flagek halmozása

Gyakran több flaget is kell használni, pl. amikor átirányítást csinálunk, és egyben [L] flaget is be szeretnénk állítani. Ekkor a kapcsos zárójelen belül vesszővel elválasztva kell feltünttni a flageket

RewriteRule ^mit$ mire [R=301,L]

További flagek

A két legfontosabb flag kétségkívül az R és az L. Több más flaget is használhatunk, ezek közül a fontosabbak:

FlagJelentésPélda
F - Forbidden/tiltottGyakorlatilag egy 403-as típusú hibaüzenetet adRewriteRule \.exe - [F]
G - Gone/megszűntGyakorlatilag egy 410-es típusú hibaüzenet, megszűnt oldal eseténRewriteRule oldalneve - [G]
NC - no case / kis-és nagybetű nem számítkis-és nagybetű nem számít

Ezeken túl további flagek leírása is megtalálható az Apache ezzel foglalkozó oldalán.

Saját magára irányítás

Ha egy oldalt saját magára irányítunk, akkor célként a - karaktert kell megadni.

RewriteRule ^index\.php$ - [L]

Elsőre nem látszik, hogy ennek mi értelme van, de nagyon is hasznos. Akkor szokás az [L] flaggel kombinálva alkalmazni, ha nagyon sok átirányítási szabály van, és a konkrét url kivétel az átirányítási szabályok alól. Ilyenkor ezt tesszük előre az [L] flaggel kombinálva , és utána jöhet minden egyéb átirányítás.

Fizikai file-ok ellenőrzése

A RewriteCond feltételben nem csak az url adott tulajdonságaira kérdezhetünk rá, hanem arra is, hogy a hivatkozás egyébként létező könyvtár vagy file-e a webszerveren. a -f azt ellenőrzi, hogy a hivatkozás létező file-e, a -d pedig azt, hogy létező könyvtár-e. Ezt általában fordított irányban szokás alkalmazni, amikor is egy felkiáltójelet tesznek elé, ami tagadást, negálást jelent, azaz !-f illetve !-d esetében akkor történik átirányítás, ha a hivatkozás nem létező file vagy könyvtár. Ezt a módszert előszeretettel alkalmazzán CMS rendszerekben. Ennek szokásos kódja az alábbi:

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

Horgonyok átirányítása

Egy hosszú lapon belül gyakran alkalmaznak horgonyokat, amikor az adott linkre kattintva nem az oldal elejére, hanem egy valahol az oldal közepén megadott horgonyra ugrik a böngésző. Ennek megadása a # jellel történik.

Felmerülhet, hogy ha később egy ilyen oldalt apró darabokra széttördelünk, és horgonyok helyett több aloldalt hozunk létre, akkor hogy oldjuk meg a horgonyoktól függő átirányításokat külön aloldalakra?

A válasz az, hogy sajnos sehogy. A horgonyokat teljes mértékben a böngésző kezeli, nem kerül megküldésre a szerver felé a kérés, így nem is tudjuk átirányítani.