Amikor a felhasználó beír egy adott URL-címet a böngészőbe, és megnyomja az Enter billentyűt, a kérést fogadó webkiszolgáló megpróbálja megtalálni a kiszolgálón az URL-címben megadott elérési útvonalon lévő fájlt. Ha az útvonalon nem talál semmit, akkor egy indexfájlt, például az index.html vagy index.php fájlt nyitja meg. ha nem talál semmit, akkor 404-es hibaüzenetet kap. Nem lennének szép és könnyen érthető URL-jeink, ha a dolgok nem úgy működnének, ahogyan most. Ezeket az URL-eket sok webhelyen használják. Az apache mod rewrite modul ezt a problémát hivatott megoldani Ebben a bemutatóban megnézzük, hogyan lehet engedélyezni.
Ha minden a leírtak szerint működött, akkor az oldal bármelyik linkjének megnyitásakor a gyökérkönyvtárban léteznie kell egy azonos nevű fájlnak vagy szkriptnek a címsorból. De ez nem így van. Az URL lekérdezésekor a webszerver kísérletet tesz egy ilyen fájl megtalálására, de ha nem találja, akkor ahelyett, hogy 404-es hibát adna vissza, átadja a vezérlést a mod_rewrite modulnak, amely minden ilyen URL esetében az index.php szkriptet hajtja végre, átadva neki a domain után a lekérdezési karakterláncot. A PHP ezután ezeket az adatokat használja fel arra, hogy megtalálja és visszaadja a felhasználónak a kívánt oldalt.
A mod rewrite engedélyezéséhez futtassunk egy egyszerű parancsot:
$ sudo a2enmod rewrite
A webszerver újraindítása után:
$ sudo systemctl restart apache
Csak azért, mert a modul engedélyezve van az Apache webkiszolgáló szintjén, még nem jelenti azt, hogy működni fog egy weboldalon. Ehhez a .htaccess fájlban kell beállítani, megadni, hogy melyik szkriptre továbbítsa a kéréseket a nem létező oldalakra. Ahhoz, hogy a .htaccess fájl működjön, az AllowOwerride: All
direktívát hozzá kell adni a virtuális hoszt Directory szakaszához.
Példaként:
Ezután például a WordPressben a .htaccess fájlhoz ilyen sorokat kell hozzáadni:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
All kód az IfModule direktívába kerül, így a benne lévő kódot csak akkor lehet végrehajtani, ha a mod_rewrite modul engedélyezve van, egyébként ezek a sorok egyszerűen figyelmen kívül maradnak. A RewriteEngine On direktíva engedélyezi a modult az aktuális könyvtárban. Ezután a RewriteBase megadja, hogy a domain utáni teljes karakterláncot át kell adni a szkriptnek. Ezután következnek a RwriteRule szabályok, amelyek feltételei a RewriteCond, amely szigorúan egymás után hajtódik végre.
Az egyik RewriteRule szabály ^index .php$ - [L]
azt mondja, hogy ha az URL tartalmazza az index.php-t, akkor az URL-t át kell írni /-re. Ebben a reguláris kifejezésben a teljes karakterláncot adjuk meg, és a pontot backslash-szel szüntetjük meg. Az [L]
jelző azt jelenti, hogy ha az URL megfelel ennek a szabálynak, akkor a következő szabályokat nem kell ellenőrizni. A szabály végrehajtása után az URL átíródik, és a webkiszolgáló feltételezi, hogy a / kérést kapta, a szabályelemzés újra kezdődik, és ezúttal az utolsó szabálynak fog megfelelni.
A RewriteCond feltételek minden további szabályra vonatkoznak. Tehát a RewriteCond %{REQUEST_FILENAME} !-f
és a RewriteCond %{REQUEST_FILENAME} !-d
csak akkor engedi az utolsó szabály végrehajtását, ha az URL nem fájl vagy mappa. Az utolsó szabály mindent átirányít a ./index.php szkriptre.
Ha nem érted a mod_rewrite beállításait, érdemes megnézni, mi történik a webszerverben az átirányítások során. Ehhez a webhely virtuális hosztjának konfigurációjában ezt a sort kell hozzáadni.
Például:
$ sudo vi /etc/apache2/sites-available/001-texts.conf
LogLevel warn rewrite:trace4
Ezután a naplófájlban, amelyet az ErrorLog utasításban adunk meg, látni fogod a webszerver összes kísérletét, hogy az URL-t a szabályaidnak megfelelően alakítsa át, és megértheted, hogy mit csinálsz rosszul. Ebben a bemutatóban azt ismertettük, hogyan engedélyezzük az Apache mod újraírását, valamint azt, hogyan működik az egész, és hogyan keressük a hibákat.