Начини на плащане Abuse

Включаем Apache Mod Rewrite

06.03.2022, 00:06

Когато потребителят въведе определен URL адрес в браузъра и натисне Enter, уеб сървърът, който получава заявката, се опитва да намери файл на сървъра по пътя, посочен в URL адреса. Ако по пътя не бъде намерен нищо, се отваря индексен файл, например index.html или index.php. ако не бъде намерен нищо, се връща грешка 404. Нямаше да имаме красиви и лесни за разбиране URL адреси, ако нещата не работеха по начина, по който работят сега. Тези URL адреси се използват в много сайтове. Модулът за пренаписване на apache mod е предназначен за решаване на този проблем В този урок ще видим как да го активираме.

Включване на мода

Ако всичко работи по описания начин, то при отваряне на който и да е линк от този сайт в главната директория трябва да съществува файл или скрипт със същото име от адресната лента. Но това не е така. При заявка на този URL адрес уеб сървърът прави опити да намери такъв файл, но ако не го намери, вместо да върне грешка 404, той предава управлението на модула mod_rewrite, който за всички такива URL адреси изпълнява скрипта index.php, като му предава низа на заявката след домейна. След това PHP използва тези данни, за да намери и върне страницата, от която се нуждае потребителят.

За да активирате mod rewrite, изпълнете една проста команда:

$ sudo a2enmod rewrite

След рестартиране на уеб сървъра:

$ sudo systemctl restart apache

Това, че модулът е разрешен на ниво уеб сървър Apache, не означава, че той ще работи за даден уебсайт. За тази цел той трябва да бъде конфигуриран във файла .htaccess, да се посочи на кой скрипт да се предават заявките към несъществуващи страници. За да работи файлът .htaccess, в раздела Directory (Директория) на виртуалния хост трябва да се добави директивата AllowOwerride: All (Всички)

Като пример:

След това, например в 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>

All се поставя в директивата IfModule, което позволява кодът в нея да се изпълнява само когато модулът mod_rewrite е разрешен, в противен случай тези редове просто се игнорират. Директивата RewriteEngine On активира модула за текущата директория. След това RewriteBase указва, че целият низ след домейна трябва да се предаде на скрипта. След това идват правилата RwriteRule с условията за тях RewriteCond, които се изпълняват строго последователно.

Едно от правилата RewriteRule ^index. php$ - [L] гласи, че ако URL адресът съдържа index.php, той трябва да бъде пренаписан на /. В този регулярен израз се посочва целият низ, а точката се избягва с обратна наклонена черта. Флагът [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, ще видите всички опити на уеб сървъра да преобразува URL адреса според вашите правила и ще можете да разберете какво правите погрешно. В този урок разгледахме как да активирате мода за презапис на Apache, както и как работи всичко това и как да търсите грешки.