Kai naudotojas naršyklėje įveda tam tikrą URL adresą ir paspaudžia Enter, užklausą gavęs žiniatinklio serveris bando rasti serveryje failą URL nurodytu keliu. Jei šiame kelyje nieko nerandama, atidaromas rodyklės failas, pavyzdžiui, index.html arba index.php. jei nieko nerandama, grąžinama 404 klaida. Neturėtume gražių ir lengvai suprantamų URL adresų, jei viskas nebūtų veikę taip, kaip dabar. Šie URL naudojami daugelyje svetainių. Šiai problemai spręsti sukurtas "Apache mod rewrite" modulis Šioje pamokoje pamatysime, kaip jį įjungti.
Jei viskas veikė taip, kaip aprašyta, tai atidarius bet kurią šios svetainės nuorodą šakniniame kataloge turėtų egzistuoti to paties pavadinimo failas arba skriptas iš adreso juostos. Tačiau taip nėra. Užklausus šį URL adresą, žiniatinklio serveris bando surasti tokį failą, bet jei jo neranda, užuot grąžinęs 404 klaidą, perduoda valdymą mod_rewrite moduliui, kuris visiems tokiems URL adresams vykdo index.php scenarijų, perduodamas jam užklausos eilutę po domeno. PHP naudoja šiuos duomenis, kad surastų ir grąžintų naudotojui reikiamą puslapį.
Norėdami įjungti mod rewrite, atlikite paprastą komandą:
$ sudo a2enmod rewrite
Iš naujo paleidus žiniatinklio serverį:
$ sudo systemctl restart apache
Jei modulis įjungtas "Apache" žiniatinklio serverio lygmeniu, tai dar nereiškia, kad jis veiks svetainėje. Tam tikslui jį reikia sukonfigūruoti .htaccess faile, nurodyti, kokiam scenarijui perduoti užklausas į neegzistuojančius puslapius. Kad .htaccess failas veiktų, į virtualiojo prieglobos kompiuterio katalogo skiltį turi būti įtraukta direktyva AllowOwerride: All
Pavyzdys:
Toliau, pavyzdžiui, "WordPress", į .htaccess failą reikia pridėti tokias eilutes:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Visos kodas patalpinamas į direktyvą IfModule, todėl joje esantis kodas gali būti vykdomas tik tada, kai įjungtas mod_rewrite modulis, kitu atveju šios eilutės tiesiog ignoruojamos. RewriteEngine On direktyva įjungia modulį dabartiniame kataloge. Tada RewriteBase nurodo, kad visa eilutė po domeno turi būti perduota scenarijui. Toliau eina RwriteRule taisyklės su joms skirtomis sąlygomis RewriteCond, kurios vykdomos griežtai nuosekliai.
Viena iš RewriteRule taisyklių ^index. php$ - [L]
sako, kad jei URL yra index.php, URL turi būti perrašytas į /. Šioje reguliariojoje išraiškoje nurodoma visa eilutė, o taškas užbraukiamas atgaliniu pasviruoju brūkšniu. Žyma [L]
reiškia, kad URL atitinka šią taisyklę, tada toliau pateiktos taisyklės neturėtų būti tikrinamos. Įvykdžius šią taisyklę, URL bus perrašytas ir žiniatinklio serveris manys, kad gavo užklausą /, taisyklių analizė bus pradėta iš naujo ir šį kartą ji atitiks paskutinę taisyklę.
RewriteCond sąlygos taikomos visoms vėlesnėms taisyklėms. Taigi turime RewriteCond %{REQUEST_FILENAME} !-f
ir RewriteCond %{REQUEST_FILENAME} !-d
leidžia vykdyti paskutinę taisyklę tik tuo atveju, jei URL nėra failas ar aplankas. Paskutinė taisyklė viską nukreipia į ./index.php scenarijų.
Jei nesuprantate mod_rewrite nustatymų, verta pasidomėti, kas vyksta žiniatinklio serveryje peradresavimo metu. Norėdami tai padaryti virtualiojo svetainės prieglobos kompiuterio konfigūracijoje, turite pridėti šią eilutę.
Pavyzdžiui:
$ sudo vi /etc/apache2/sites-available/001-texts.conf
LogLevel warn rewrite:trace4
Tada žurnalo faile, kuris pateikiamas ErrorLog direktyvoje, matysite visus žiniatinklio serverio bandymus konvertuoti URL pagal jūsų taisykles ir galėsite suprasti, ką darote ne taip. Šioje pamokoje aprašėme, kaip įjungti "Apache mod rewrite", taip pat kaip visa tai veikia ir kaip ieškoti klaidų.