Начини плаћања Abuse

Омогући преписивање Apache модова

06.03.2022, 00:06

Када корисник укуца одређени URL у прегледач и притисне Ентер, веб сервер који прими овај захтев покушава да добије датотеку на серверу на путањи наведеној у URL-у. Ако ништа није наведено на путањи, отвара се индексна датотека, као што је index.html или index.php. Ако се ништа не пронађе, враћа се грешка 404. Не бисмо имали лепе и лако читљиве URL-ове да све не функционише онако како сада функционише. Ове адресе се користе на многим сајтовима. Модул за преписивање апача је дизајниран да реши овај проблем. У овом упутству ћемо размотрити како га омогућити.

Укључи мод

Ако је све функционисало како је описано, онда би приликом отварања било које везе овог сајта у коренском директоријуму требало да постоји датотека или скрипта са истим именом из адресне траке. Али то није случај. Приликом захтева за овом УРЛ адресом, веб сервер покушава да пронађе такву датотеку, али ако је не пронађе, уместо враћања грешке 404, контрола се преноси на модул mod_rewrite, који за све такве УРЛ адресе извршава скрипту index.php, прослеђујући јој стринг упита након домена. Након чега PHP, на основу ових података, проналази и враћа страницу коју тражи корисник.

Да бисте омогућили преписивање модова, покрените једноставну команду:

 $ sudo a2enmod rewrite

Након поновног покретања веб сервера:

 $ sudo systemctl restart apache

Чињеница да је модул омогућен на нивоу Apache веб сервера не значи да ће радити и за веб локацију. Да бисте то урадили, потребно је да га конфигуришете у .htaccess датотеци, наведете којој скрипти треба проследити захтеве ка непостојећим страницама. Да би .htaccess датотека радила, потребно је да додате директиву AllowOwerride: All у одељак Directory виртуелног хоста.

Као пример:

Затим, на пример, у WordPress-у треба да додате следеће линије у .htaccess датотеку:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>

Сав код је смештен у директиву IfModule, која дозвољава да се код унутра извршава само када је модул mod_rewrite омогућен, у супротном се ове линије једноставно игноришу. Директива RewriteEngine On омогућава модул за тренутни директоријум. Затим, користећи RewriteBase, наводи се да се цела линија после домена мора проследити скрипти. Затим долазе правила RwriteRule са својим условима RewriteCond, која се извршавају строго секвенцијално.

Једно од правила RewriteRule ^index.php$ - [L] каже да ако URL садржи index.php, URL треба преписати у /. У овом регуларном изразу, цео ред је наведен, а тачка је избегнута обрнутом косом цртом. Заставица [L] значи да ако URL одговара овом правилу, онда следећа правила не треба проверавати. Након што се ово правило изврши, URL ће бити преписан и веб сервер ће мислити да је примио захтев за /, анализа правила ће почети од почетка и овог пута ће се подударати са последњим правилом.

Услови RewriteCond-а примењују се на сва наредна правила. Дакле, имамо RewriteCond %{REQUEST_FILENAME} !-f и RewriteCond %{REQUEST_FILENAME} !-d који дозвољавају извршавање последњег правила само ако URL није датотека или фасцикла. Последње правило преусмерава све на ./index.php скрипту.

Ако не можете да схватите подешавања mod_rewrite, вреди погледати шта се дешава унутар веб сервера током преусмеравања. Да бисте то урадили, додајте следећи ред у конфигурацију виртуелног хоста сајта.

На пример:

 $ sudo vi /etc/apache2/sites-available/001-texts.conf LogLevel warn rewrite:trace4

Затим, у лог датотеци, која је дата у директиви ErrorLog, видећете све покушаје веб сервера да трансформише УРЛ према вашим правилима и моћи ћете да разумете шта радите погрешно. У овом упутству смо размотрили како да омогућите преписивање модова у Апачу, као и како све то функционише и како да тражите грешке.