Kad lietotājs pārlūkprogrammā ievada konkrētu URL un nospiež Enter, tīmekļa serveris, kas saņem pieprasījumu, mēģina serverī atrast URL norādītajā ceļā esošo failu. Ja ceļā nekas netiek atrasts, tiek atvērts indeksa fails, piemēram, index.html vai index.php. ja nekas netiek atrasts, tiek atgriezta 404 kļūda. Mums nebūtu skaistu un viegli saprotamu URL, ja viss nedarbotos tā, kā tas notiek tagad. Šādi URL tiek izmantoti daudzās vietnēs. Apache mod rewrite modulis ir izstrādāts, lai atrisinātu šo problēmu Šajā pamācībā mēs redzēsim, kā to iespējot.
Ja viss ir darbojies, kā aprakstīts, tad, atverot jebkuru šīs vietnes saiti saknes direktorijā, adreses joslā vajadzētu pastāvēt failam vai skriptam ar tādu pašu nosaukumu. Bet tā nav. Pieprasot šo URL, tīmekļa serveris veic mēģinājumus atrast šādu failu, bet, ja to neatrod, tā vietā, lai atgrieztu 404 kļūdu, tas nodod vadību mod_rewrite modulim, kas visiem šādiem URL izpilda skriptu index.php, nododot tam pēc domēna pieprasījuma virkni. Pēc tam PHP izmanto šos datus, lai atrastu un atgrieztu lietotājam vajadzīgo lapu.
Lai iespējotu mod rewrite, izpildiet vienkāršu komandu:
$ sudo a2enmod rewrite
Pēc tīmekļa servera restartēšanas:
$ sudo systemctl restart apache
Tas, ka modulis ir ieslēgts Apache tīmekļa servera līmenī, nenozīmē, ka tas darbosies tīmekļa vietnē. Šim nolūkam tas jākonfigurē .htaccess failā, norādiet, uz kuru skriptu nodot pieprasījumus uz neesošām lapām. Lai .htaccess fails darbotos, virtuālā resursdatora direktoriju sadaļā Directory (Katalogs) jāpievieno direktīva AllowOwerride: All (AtļautAtvērt: Visi)
.
Piemēram:
Tālāk, piemēram, WordPress failā .htaccess ir jāpievieno šādas rindas:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Visas kods tiek ievietots direktīvā IfModule, ļaujot tajā esošo kodu izpildīt tikai tad, ja ir iespējots mod_rewrite modulis, pretējā gadījumā šīs rindas tiek vienkārši ignorētas. Direktīva RewriteEngine On ieslēdz moduli pašreizējam direktorijam. Tad RewriteBase norāda, ka skriptam ir jānodod visa rinda pēc domēna. Tālāk seko RwriteRule noteikumi ar nosacījumiem tiem RewriteCond, kas tiek izpildīti stingri secīgi.
Viens no RewriteRule noteikumiem ^index. php$ - [L]
nosaka, ka, ja URL satur index.php, URL jāpārraksta uz /. Šajā regulārajā izteicienā ir norādīta visa virkne, un punkts tiek aizklāts ar backslash. Flags [L]
nozīmē, ka, ja URL atbilst šim noteikumam, tad šādi noteikumi nav jāpārbauda. Pēc šī noteikuma izpildes URL tiks pārrakstīts, un tīmekļa serveris uzskatīs, ka tas ir saņēmis pieprasījumu /, noteikumu analīze sāksies no jauna, un šoreiz tas atbildīs pēdējam noteikumam.
RewriteCond nosacījumi attiecas uz visiem turpmākajiem noteikumiem. Tātad RewriteCond %{REQUEST_FILENAME} !-f
un RewriteCond %{REQUEST_FILENAME} !-d
ļauj izpildīt pēdējo noteikumu tikai tad, ja URL nav fails vai mape. Pēdējais noteikums novirza visu uz ./index.php skriptu.
Ja nesaprotat mod_rewrite iestatījumus, ir vērts izpētīt, kas notiek tīmekļa servera iekšienē novirzīšanas laikā. Lai to izdarītu vietnes virtuālā mitinātāja konfigurācijā, jums ir jāpievieno šī rinda.
Piemēram:
$ sudo vi /etc/apache2/sites-available/001-texts.conf
LogLevel warn rewrite:trace4
Tad žurnāla failā, kas norādīts ErrorLog direktīvā, jūs redzēsiet visus tīmekļa servera mēģinājumus konvertēt URL atbilstoši jūsu noteikumiem un varēsiet saprast, ko darāt nepareizi. Šajā pamācībā mēs esam aprakstījuši, kā iespējot Apache mod rewrite, kā arī to, kā tas viss darbojas un kā meklēt kļūdas.