Makseviisid Abuse

Apache Modi ümberkirjutamise lubamine

06.03.2022, 00:06

Kui kasutaja sisestab veebilehitsejasse konkreetse URL-aadressi ja vajutab Enter, püüab päringu saanud veebiserver leida serverist URL-aadressis määratud faili. Kui teele ei leita midagi, avatakse indeksfail, näiteks index.html või index.php. Kui midagi ei leita, tagastatakse 404-viga. Meil ei oleks ilusaid ja kergesti mõistetavaid URL-e, kui asjad ei toimiks nii, nagu nad praegu toimivad. Neid URL-e kasutatakse paljudel saitidel. Apache mod rewrite moodul on mõeldud selle probleemi lahendamiseks Selles õpetuses näeme, kuidas seda sisse lülitada.

Modi sisselülitamine

Kui kõik toimis nii nagu kirjeldatud, siis peaks selle saidi mis tahes lingi avamisel juurkataloogis olema aadressiribalt olemas sama nimega fail või skript. Aga seda ei ole. Selle URL-i päringul teeb veebiserver katseid sellise faili leidmiseks, kuid kui ta seda ei leia, siis 404 vea tagastamise asemel annab ta kontrolli mod_rewrite moodulile, mis kõigi selliste URL-de puhul täidab skripti index.php, edastades sellele päringustringi pärast domeeni. Seejärel kasutab PHP neid andmeid, et leida ja tagastada kasutajale vajalik lehekülg.

Mod rewrite'i lubamiseks käivitage lihtne käsk:

$ sudo a2enmod rewrite

Pärast veebiserveri taaskäivitamist:

$ sudo systemctl restart apache

See, et moodul on Apache'i veebiserveri tasandil lubatud, ei tähenda, et see töötab veebisaidi puhul. Selleks tuleb see konfigureerida .htaccess-failis, määrata, millise skripti alusel edastatakse päringuid mitteolevatele lehekülgedele. Selleks, et .htaccess-faili toimiks, tuleb virtuaalse host'i jaotisesse Directory lisada direktiiv AllowOwerride: All

Näitena:

Edasi tuleb näiteks WordPressi puhul lisada .htaccess faili sellised read:

<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 kood paigutatakse IfModule direktiivi, mis võimaldab selle sees olevat koodi täita ainult siis, kui mod_rewrite moodul on lubatud, vastasel juhul neid ridu lihtsalt ignoreeritakse. Direktiiv RewriteEngine On lülitab mooduli praeguse kataloogi jaoks sisse. Seejärel määrab RewriteBase, et kogu string pärast domeeni tuleks skriptile edastada. Järgmisena tulevad RwriteRule reeglid koos tingimustega neile RewriteCond, mida täidetakse rangelt järjestikku.

Üks RewriteRule reeglitest ^index .php$ - [L] ütleb, et kui URL sisaldab index.php, tuleb URL ümber kirjutada /. Selles regulaaravaldises on kogu string määratud ja punkt eemaldatakse kaldkriipsuga. Märker [L] tähendab, et kui URL vastab sellele reeglile, siis ei tohiks järgmisi reegleid kontrollida. Pärast selle reegli täitmist kirjutatakse URL ümber ja veebiserver eeldab, et ta on saanud päringu /, reegli analüüs algab uuesti ja seekord vastab see viimasele reeglile.

RewriteCond tingimused kehtivad kõigi järgnevate reeglite suhtes. Seega on meil RewriteCond %{REQUEST_FILENAME} !-f ja RewriteCond %{REQUEST_FILENAME} !-d võimaldavad viimase reegli täitmist ainult siis, kui URL ei ole fail või kaust. Viimane reegel suunab kõik ümber ./index.php skriptile.

Kui te ei saa mod_rewrite seadetest aru, siis tasub vaadata, mis toimub veebiserveri sees ümbersuunamiste ajal. Selleks tuleb saidi virtuaalse host'i konfiguratsioonis lisada järgmine rida.

Näiteks:

$ sudo vi /etc/apache2/sites-available/001-texts.conf

LogLevel warn rewrite:trace4

Siis näete logifailis, mis on antud ErrorLog-direktiivis, kõiki veebiserveri katseid muuta URL-i vastavalt teie reeglitele ja saate aru, mida te valesti teete. Selles õpetuses oleme käsitlenud, kuidas Apache mod rewrite'i sisse lülitada, samuti seda, kuidas see kõik toimib ja kuidas vigu otsida.