Способи оплати Abuse

Увімкнути перезапис модифікації Apache

06.03.2022, 00:06

Коли користувач у браузері вводить певний URL і натискає Enter, веб-сервер, який отримав цей запит, намагається роздобути файл на сервері за шляхом, вказаним в URL. Якщо за шляхом нічого не вказано, відкривається індексний файл, наприклад index.html або index.php. у тому випадку, коли нічого не виявлено, відбувається повернення помилки 404. Ми б не мали красивих і зручних для сприйняття URL, якби все працювало не так як зараз. Ці адреси використовуються на багатьох сайтах. Модуль apache mod rewrite призначений для вирішення цього завдання У цій інструкції розглянемо як його ввімкнути.

Вмикаємо мод

Якби все працювало як описано, то під час відкриття будь-якого посилання цього сайту в кореневій директорії мав би існувати файл або скрипт з однойменною назвою з адресного рядка. Але це не так. Під час запиту цієї 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>

Увесь код поміщено в директиву 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, ви побачите всі спроби веб-сервера перетворити URL за вашими правилами і зможете зрозуміти, що ви робите не так. У цій інструкції ми розглянули як увімкнути mod rewrite Apache, а також як все це працює і як шукати помилки.